AfxMessageBox出现在MFC对话框后面

时间:2012-02-13 15:37:53

标签: c++ mfc modal-dialog

在我的应用程序的主视图中,我创建了一个无模式对话框,即:

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);

4 个答案:

答案 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();
}