为什么不会显示消息框?

Adr*_*ian -2 c++ mfc

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

发生的情况是直到按ALT键,消息框才可见。

我仍在尝试把头放在他们正在使用的窗口设置周围,但是也许有人可以为我提供有关查找内容的线索?

我写了一个变通办法,将所有者窗口和消息框的标题传递给一个类,该类产生一个遍历所有窗口的线程,并找到由具有指定标题的指定所有者拥有的消息框对话框。但是,我必须进行搜索并替换1000多个实例,才能使其在系统范围内正常工作。

更好的选择是找到根本原因。但是,这非常复杂。我应该寻找可能导致此行为的任何线索,将不胜感激。

Adr*_*ian 5

这是由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);
}
Run Code Online (Sandbox Code Playgroud)

这将输出队列中的所有消息,并向我显示WM_PAINT犯罪者是哪个窗口和哪个消息(在本例中为)。

然后,我跟踪该窗口所附加的类对象,并查看它的OnPaint()处理程序。

原来,以前的程序员在构造对象之前先加上了ifx然后是return条件CPaintDC。其构造函数调用BeginPaint(),进而验证无效区域。在不验证无效区域的情况下,系统将继续生成WM_PAINT消息,直到无效区域为空。这将导致消息队列永远不会为空。

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

-ROOT                            -ROOT
 +-CHILD                          +-MESSAGE BOX 
  +-MESSAGE BOX                   +-CHILD 
  +-CHILD                          +-CHILD 
   +-CHILD                          +-CHILD < Offender 
    +-CHILD < Offender               +-CHILD 
     +-CHILD                      
Run Code Online (Sandbox Code Playgroud)