我编写了一个基于MFC CDialog
的应用程序。在正常情况下,它会通过CDialog
处理程序显示InitInstance
窗口来启动:
CMyDialog dlg;
INT_PTR nResponse = dlg.DoModal();
但是这个应用程序第一次运行时,我需要在主对话框出现在屏幕上之前显示CMyDialog::OnInitDialog
内的另一个对话框。所以我做了类似的事情:
CIntroDialog idlg(this);
idlg.DoModal();
但是这种方法的问题是我的第二个CIntroDialog
没有显示在前台。因此,我尝试通过在CIntroDialog::OnInitDialog
内调用以下内容来解决此问题:
this->SetForegroundWindow();
this->BringWindowToTop();
但它没有做任何事情。
然后我尝试从::AllowSetForegroundWindow(ASFW_ANY);
为应用调用InitInstance
,而且也没有做任何事情。
知道如何在应用程序启动时将第二个对话框置于前台吗?
PS。由于此应用的结构,我需要在CIntroDialog::DoModal
内拨打CMyDialog::OnInitDialog
,以防止进行大量重写。
答案 0 :(得分:3)
您是否考虑在应用类中使用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
}
我承认我没有测试过上面的代码,但我不明白为什么你不能执行第一个对话然后再执行第二个对话。