主窗口作为无模式对话框的 MFC 应用程序

Posted

技术标签:

【中文标题】主窗口作为无模式对话框的 MFC 应用程序【英文标题】:MFC App with main window as modeless dialog 【发布时间】:2011-06-28 08:33:52 【问题描述】:

我正在开发一个 MFC 应用程序并将其导出到 dll 中。该应用程序只有一个窗口,我希望该窗口无模式。在 InitInstance() 内部,如果我希望它是模态的,我只需要这样做:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CUIWelcomeDlg 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

return false;

它作为一个模式工作得很好。这是无模式的代码:

AFX_MANAGE_STATE(AfxGetStaticModuleState());
CUIWelcomeDlg * dlg;
dlg=new CUIWelcomeDlg();
m_pMainWnd=dlg;
if(dlg!=NULL) 
    dlg->Create(IDD_UIWELCOME_DIALOG,NULL);
    dlg->ShowWindow(SW_SHOW);
 
return true;

我尝试调试它。在它达到 return true 之前很好;之后,对话窗口冻结并且没有响应。有谁知道如何解决这个问题?

【问题讨论】:

出于好奇,只是:基于无模式对话框的应用程序有什么意义?什么情况下需要这样做? 【参考方案1】:

尝试删除以下行: m_pMainWnd = dlg;

(如果这里dlg是一个指针,你应该叫它pdlg)。

【讨论】:

【参考方案2】:

您需要实现自己的无限循环。当然,您不想让 UI 线程停止响应,因此您需要在此循环内捕获和调度消息。尝试在 ShowWindow 之后添加:

MSG msg;

// Handle dialog messages
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

    if(!IsDialogMessage(&msg))
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);  
    

【讨论】:

嗯,其实我也不是很懂,不过这不是无限循环吗?那么如果我在 ShowWindow(InitInstance 内部)之后执行此操作,InitInstance 将永远不会返回? 是和不是。它是无限循环,但您正在此循环内处理消息,因此它将处理关闭窗口消息并且应用程序将结束。我会试一试……当然这取决于你。

以上是关于主窗口作为无模式对话框的 MFC 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

从 mfc 扩展 dll 导出的无模式对话框不显示

在 MFC 中不断增加进度条

控件不在无模式对话框 MFC 中呈现

如何使用 MFC 从控制台正确弹出无模式对话框

如何“正确关闭 MFC 无模式对话框并修复资源泄漏”

[转]MFC子线程更改图像数据后更新主窗口图像显示方法