当基于 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 可能是个坏主意。 令人惊讶的是,这里的一个小测试可以正常工作。我会尝试查看 OnInitDialogs 中的一个或两个中的注释代码是否有效。如果您不正确,您可以在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 找不到资源 (MFC)

当应用程序进入前台时,如何重新启动基于块的动画?

基于 CDialog 的应用程序是不是应该设置 AfxGetApp()->m_pMainWnd

如何在 CWinThread 派生类中正确创建 CDialog 框

如何在 MFC CDialog 类中自动删除事件处理程序?