为什么不显示消息框?

时间:2016-12-12 17:34:59

标签: c++ mfc

我正在使用一个非常奇怪的窗口模式设置的MFC项目。我认为这种设置搞砸了拥有的消息框的显示方式。

发生的事情是,在按下ALT键之前,消息框将不可见。

我仍然试图绕着他们正在使用的窗口设置,但也许有人能够给我一个关于要寻找什么的线索?

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

更好的选择是找到根本原因。但这种复杂性令人生畏。我非常感谢任何可能导致这种行为的线索。

1 个答案:

答案 0 :(得分:4)

这是由MFC CDialog DoModal can't show window if parent window message queue is 'busy''功能'引起的,如果消息队列包含任何消息,它将不会显示系统消息框。 (请对该错误进行投票或评论。这种行为非常意外。)

我通过尝试使用以下方法填充队列中的所有消息来跟踪此情况:

nullptr

这将输出队列中的所有消息,并向我显示了什么窗口以及什么消息(在这种情况下,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()对象之前放置了if x然后return条件。它的构造函数调用CPaintDC,然后验证无效区域。在不验证无效区域的情况下,系统继续生成BeginPaint()个消息,直到无效区域为空。这将导致消息队列永远不会为空。

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

WM_PAINT