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

Visual c++ 主窗口为无模式对话框的MFC应用程序,visual-c++,mfc,dialog,modeless,Visual C++,Mfc,Dialog,Modeless,我正在开发一个MFC应用程序并将其导出到dll中。应用程序只有一个窗口,我希望该窗口无模式。在InitInstance()内部,如果我希望它是模态的,我只需要执行以下操作: AFX_MANAGE_STATE(AfxGetStaticModuleState()); CUIWelcomeDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Pla

我正在开发一个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;

我试着调试它。在它达到返回真值之前,它是好的;在此之后,对话框窗口冻结,没有响应。有人知道如何修复此问题吗?

尝试删除以下行:
m_pMainWnd=dlg


(如果这里dlg是一个指针,您应该称它为pdlg)。

您需要实现自己的无止境循环。当然,您不希望为了响应而停止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将永远不会返回?是和否。它是无限循环,但您正在该循环中处理消息,因此它将处理关闭窗口消息,应用程序将结束。我会试试看……当然,这取决于你。