为什么不会显示一个消息框

Why would a message box be not displaying?

本文关键字:一个 消息 显示 为什么不      更新时间:2023-10-16

我在一个具有非常奇怪的窗口模式设置的MFC项目上。我认为此设置正在搞砸如何显示自有的消息框。

发生的事情是,在按下alt键之前,不会看到消息框。

我仍在尝试将我的头缠在他们正在使用的窗户设置上,但是也许有人可以给我一个有关寻找什么的线索?

我写了一个解决方法,在其中我将所有者窗口和消息框的标题传递到一个类,该类催生了一个遍布所有窗口的线程,并找到了一个消息框对话,该对话由指定的所有者拥有,标题为标题。但是,我将不得不进行搜索和替换1000多个实例,以使其成为范围的工作系统。

更好的选择是找到根本原因。但是,这种复杂性非常艰巨。我应该寻找的任何线索可能会引起这种行为。

这是由MFC cdialog domodal引起的系统消息框。(请对该错误进行投票或评论。行为非常出乎意料。)

我通过尝试使用以下方式试图填充队列中的所有消息来追踪这一点:

MSG msg = { 0 };
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
    TRACE(_T(R"--(,"% *.*s",PEEK,0x%08x,"%s",0x%08x,0x%08x,0x%08x)--" "n"),
              0, 0, _T(""), msg.hwnd, "Window HAS msg",
              msg.message, msg.wParam, msg.lParam);
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

这将输出队列中的所有消息,并向我展示什么窗口和什么消息(在这种情况下,WM_PAINT)是罪犯。

然后,我追踪了附加到的窗口的哪个类对象,并查看了其OnPaint()处理程序。

事实证明,先前的程序员在构造CPaintDC对象之前先放置一个if X,然后将return条件放置。它的构造函数调用BeginPaint(),进而验证了无效的区域。在没有验证无效区域的情况下,系统将继续生成WM_PAINT消息,直到无效的区域为空。这将导致消息队列永不空。

不确定这是否重要,但是有问题的窗口和对话框之间的关系是它们位于同一线程中,与根应用程序窗口相同。有两个显示模式,具有以下设置:

-ROOT                            -ROOT
 +-CHILD                          +-MESSAGE BOX 
  +-MESSAGE BOX                   +-CHILD 
  +-CHILD                          +-CHILD 
   +-CHILD                          +-CHILD < Offender 
    +-CHILD < Offender               +-CHILD 
     +-CHILD