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,并在从它返回后我尝试提供消息框 但它没有显示
答案 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,因此不会显示消息框。