在我的应用程序的主视图中,我创建了一个无模式对话框,即:
CMyDialog dlg;
int returnval = dlg.doModal();
现在这是第一次发生这种情况,但在这个特定的对话框中,如果我想在按下按钮时显示一个消息框,则始终会出现在对话框后面。如果我按下键盘上的alt键,它就会获得焦点并出现在前面。
int nResult = AfxMessageBox(_T("Are you sure you want to delete this file?"), MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND | MB_TOPMOST | MB_TASKMODAL);
if(nResult == IDNO){
return;
}
else{
...
}
我想知道我做了什么或我检查了哪些选项会导致这种行为?
编辑:这是我的OnInitDialog函数中的一小部分代码,我注释掉了所有其余部分并保持相同的行为:
CDialog::OnInitDialog();
DEVMODE sDevMode;
ZeroMemory(&sDevMode, sizeof(DEVMODE));
sDevMode.dmSize = sizeof(DEVMODE);
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&sDevMode);
_screenw = (int)sDevMode.dmPelsWidth;
_screenh = (int)sDevMode.dmPelsHeight;
_dlgx = (int) 50;
_dlgy = (int) 50;
_dlgw = (int) _screenw-100;
_dlgh = (int) _screenh-100;
this->MoveWindow(_dlgx,_dlgy,_dlgw,_dlgh);
答案 0 :(得分:5)
通过在DoModal()之前调用CWnd :: PostMessage(0x118),我能够解决同样的问题,如报告here。
这似乎是MFC架构中的一个小故障,因为如果底层消息循环不为空并且唯一的方法是发出0x118消息或ALT按键(WM_SYSKEYDOWN),则不显示该对话框。
所以这个问题的解决方法可能是:
CMyDialog dlg;
CWnd::PostMessage(0x118);
int returnval = dlg.doModal();
答案 1 :(得分:1)
您可以使用MB_APPLMODAL将其放在应用程序的所有窗口之前。
您应该做的是创建消息框作为对话框的子项。为此使用CWnd :: MessageBox。
答案 2 :(得分:0)
AfxMessageBox
在Z顺序的顶部窗口中始终是模态的。我认为没有必要传递额外的标志来推进它。是的,如果应用程序(主窗口)不在焦点,您可以在调用AfxMessageBox
之前显式激活它。
我看到消息框未出现的唯一情况是父窗口是由其他线程创建的,而AfxMessageBox
是从另一个线程调用的。
答案 3 :(得分:0)
感谢您的提示。如果您没有从主窗口调用DoModal,这是另一种适用于我的表单:
void MyApp::OnAppAbout()
{
CAboutDlg aboutDlg;
CWnd * pParent = GetMainWnd();
if (pParent)
pParent->PostMessage(WM_SYSKEYDOWN);
aboutDlg.DoModal();
}