【问题标题】:AfxMessageBox appears behind MFC dialogAfxMessageBox 出现在 MFC 对话框后面
【发布时间】:2012-03-05 00:24:40
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过使用CMyDialog 类的MessageBox() 函数? AfxMessageBox()CWnd::MessageBox() 的不同之处在于提供给底层 MessageBox() Win32 API 函数的 HWND 参数。
  • 奇怪,您是否在对话框初始化函数中设置了任何扩展窗口样式?也许玩 Z-Order?
  • 看看我的编辑,里面几乎什么都没有。
  • 你能显示你的MessageBox()正在显示的功能吗?
  • 我在对话框中添加了一个按钮,然后单击添加事件处理程序,该函数中使用的唯一代码就是我发布的代码。正如我在另一个回复中所说,我将只做一个新对话框,确保消息框看起来很好,然后复制粘贴我放在那里的其他内容。这不是很多工作。它只是让我感到困惑为什么会发生..

标签: c++ mfc modal-dialog


【解决方案1】:

我能够通过在 DoModal() 之前调用 CWnd::PostMessage(0x118) 来解决同样的问题,正如报告的 here.

这似乎是 MFC 架构中的一个小故障,因为如果底层消息循环不为空,则不会显示对话框,唯一的方法是发出 0x118 消息或 ALT 按键 (WM_SYSKEYDOWN)。

所以这个问题的解决方法可能是:

CMyDialog dlg;
CWnd::PostMessage(0x118);
int returnval = dlg.doModal();

【讨论】:

    【解决方案2】:

    您可以使用 MB_APPLMODAL 将其置于应用程序中所有窗口的前面。

    您应该做的是将消息框创建为对话框的子项。为此使用 CWnd::MessageBox。

    【讨论】:

    • 试过MB_APPLMODAL,没用。将尝试使用 MessageBox() 函数。
    • CWnd::MessageBox 也出现在我的对话框后面,直到我按下键盘上的 alt 键...我想我会删除我的对话框并重做一个新的...:/跨度>
    【解决方案3】:

    AfxMessageBox 在 Z 顺序的顶部窗口中始终是模态的。我认为没有必要传递额外的标志来推动它。是的,如果应用程序(主窗口)不在焦点上,您可以在调用 AfxMessageBox 之前显式激活它。

    我看到消息框没有出现的唯一情况是父窗口由其他线程创建,而 AfxMessageBox 正在从另一个线程调用。

    【讨论】:

    • 对话框是在主应用程序线程中创建的,并且在按下按钮时直接在对话框中调用消息框。我刚刚开始了一个新对话框,消息框看起来很好。我认为这个可能会以某种方式损坏......
    • 我尝试将焦点设置在主窗口上。不知道它对你做了什么魔法。它什么也没做。这个答案是如何被接受的?你能解释一下它是如何工作的吗?
    【解决方案4】:

    感谢您的提示。如果您不从主窗口调用 DoModal,这是另一种对我有用的表单:

    void MyApp::OnAppAbout()
    {
    
        CAboutDlg aboutDlg;
        CWnd * pParent = GetMainWnd();
        if (pParent)
            pParent->PostMessage(WM_SYSKEYDOWN);
    
        aboutDlg.DoModal();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-30
      • 2019-04-18
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多