当基于 CDialog 的应用程序启动时,如何将我的辅助对话框窗口置于顶部?
Posted
技术标签:
【中文标题】当基于 CDialog 的应用程序启动时,如何将我的辅助对话框窗口置于顶部?【英文标题】:How to bring my secondary dialog window to the top when the CDialog-based app starts? 【发布时间】:2016-12-08 08:53:09 【问题描述】:我编写了一个基于 MFC CDialog
的应用程序。在正常情况下,它通过显示来自InitInstance
处理程序的CDialog
窗口来启动,如下所示:
CMyDialog dlg;
INT_PTR nResponse = dlg.DoModal();
但是第一次运行这个应用程序时,我需要在主对话框出现在屏幕上之前从CMyDialog::OnInitDialog
中显示另一个对话框。所以我做了类似的事情:
CIntroDialog idlg(this);
idlg.DoModal();
但是这种方法的问题是我的第二个CIntroDialog
没有显示在前台。所以我试图通过在CIntroDialog::OnInitDialog
中调用以下命令来解决这个问题:
this->SetForegroundWindow();
this->BringWindowToTop();
但它什么也没做。
然后我尝试从InitInstance
调用::AllowSetForegroundWindow(ASFW_ANY);
以获取该应用程序,但这也没有任何作用。
知道如何在应用启动时将第二个对话框置于前台吗?
PS。由于这个应用程序的结构,我需要在CMyDialog::OnInitDialog
中调用CIntroDialog::DoModal
以防止大量重写。
【问题讨论】:
不确定,但从OnInitDialog
函数调用 CIntroDialog::DoModal
可能是个坏主意。
令人惊讶的是,这里的一个小测试可以正常工作。我会尝试查看 OnInitDialog
s 中的一个或两个中的注释代码是否有效。如果您不正确,您可以在CMyDialog::OnInitDialog
中设置一个计时器,使其在半秒内或其他时间结束,然后在计时器处理程序中调用CIntroDialog
。
您是否需要在“介绍”对话框中进行任何用户交互,或者只是为了显示信息?
是的,介绍对话框中有一些用户交互。
只是预感,确保您的 CIntroDialog 资源 Visible 属性设置为 TRUE。我总是被那个烫伤。
【参考方案1】:
您是否考虑在应用程序类中为此使用InitInstance
?
BOOL CMyApp::InitInstance()
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
// TODO: Place code here to handle when the dialog is
// dismissed with OK
else if (nResponse == IDCANCEL)
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
我已经删掉了一些默认实现,但你看到了这一点:
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
// TODO: Place code here to handle when the dialog is
// dismissed with OK
else if (nResponse == IDCANCEL)
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
没有什么能阻止你做这样的事情:
CMyDlg2 dlg2;
if(dlg2.DoModal() == IDOK)
CMyDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
// TODO: Place code here to handle when the dialog is
// dismissed with OK
else if (nResponse == IDCANCEL)
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
else
// Handle IDCANCEL
我承认我没有测试过上面的代码,但是我看不出为什么你不能执行第一个对话然后第二个对话。
【讨论】:
就像我上面提到的:“由于这个应用程序的结构,我需要从 CMyDialog::OnInitDialog 中调用 CIntroDialog::DoModal 以防止大量重写。”以上是关于当基于 CDialog 的应用程序启动时,如何将我的辅助对话框窗口置于顶部?的主要内容,如果未能解决你的问题,请参考以下文章
当 CDialog.DoModal() 函数无法创建对话框时?
基于 CDialog 的应用程序是不是应该设置 AfxGetApp()->m_pMainWnd