无法打印AfxMessagBox()之后的doModal()方法

时间:2012-01-23 10:30:02

标签: visual-c++ mfc

BOOL CmsgboxApp::InitInstance()  
{
    INITCOMMONCONTROLSEX InitCtrls;  
    InitCtrls.dwSize = sizeof(InitCtrls);  
    InitCtrls.dwICC = ICC_WIN95_CLASSES;  
    InitCommonControlsEx(&InitCtrls);  
    CWinApp::InitInstance();  
    AfxEnableControlContainer();  
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));  
    CmsgboxDlg dlg;  
    m_pMainWnd = &dlg;  
    INT_PTR nResponse = dlg.DoModal();  
    if (nResponse == IDOK)  
    {  
        AfxMessageBox(L"here",0,0);//This MessageBox is not getting displayed  
    }  
    else if (nResponse == IDCANCEL)  
    {  
    }  
    return FALSE;  
}  

上面的代码AfxMessageBox()未显示。 为什么会出现这个问题?

首先我创建了Modal DialogBox,并在从它返回后我尝试提供消息框 但它没有显示

2 个答案:

答案 0 :(得分:0)

我不确定,AfxMessageBox可能不会像CDialog::DoModal()那样提供自己的消息泵。我假设AfxMessageBox只调用Win32 MessageBox()函数,这需要一个消息泵来发送绘画/点击消息等。

修改 Windows程序通过传递消息来工作。所有Windows程序都有一个消息“泵”,它处理任何传入的消息,例如绘制屏幕,​​响应鼠标点击等。最初你必须自己编写消息泵代码。

MFC出现并为您提供了一个消息泵。 CWinApp::Run()中有一个用于普通的SDI / MDI应用程序,一个用于CDialog::DoModal()用于基于对话框的应用程序(以及一般的模态对话框)。

您发布的代码是基于对话框的MFC应用程序。 “应用程序”是对话框。从该对话框返回后,没有消息泵,应用程序已经死了。在此之后你应该做的很少,可能需要一些清理工作。当然不会显示更多信息。

如果您想要显示关于关闭的更多信息,请在应用程序对话框中覆盖OnClose(),然后在那里调用AfxMessageBox()

答案 1 :(得分:0)

您应该将消息放在对话框的OnOK()处理程序中,它与对话框返回IDOK时完全相同。

AfxMessageBox()没有显示,因为此时它没有所有者窗口。如果您调试到AfxMessageBox(),您最终将进入CWinApp :: ShowAppMessageBox(...)函数,其中调用以下函数:

HWND hWnd = CWnd::GetSafeOwner_(NULL, &hWndTop);

由于对象已存在,所有者窗口现在为NULL,因此不会显示消息框。