如何在基于CDialog的应用程序启动时将辅助对话框窗口置于顶部?

时间:2016-12-08 08:53:10

标签: c++ windows winapi mfc

我编写了一个基于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,以防止进行大量重写。

1 个答案:

答案 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
}

我承认我没有测试过上面的代码,但我不明白为什么你不能执行第一个对话然后再执行第二个对话。