C++ 为什么不显示消息框?
我在一个MFC项目,有一个非常奇怪的窗口模式设置。我认为这个设置把一个消息框的显示方式搞砸了 发生的情况是,在按下ALT键之前,消息框将不可见 我仍在试图了解他们使用的窗口设置,但也许有人能给我一个线索,告诉我应该寻找什么 我编写了一个变通方法,将所有者窗口和消息框标题传递给一个类,该类生成一个线程,该线程遍历所有窗口,并找到一个消息框对话框,该对话框由指定所有者拥有,标题为指定。但是,我必须搜索并替换1000多个实例,才能使其在系统范围内正常工作 更好的选择是找到根本原因。但其复杂性相当令人望而生畏。我将非常感谢任何可能导致这种行为的线索。这是由“功能”造成的,如果消息队列包含任何消息,它将不会显示系统消息框。(请对该错误进行投票或评论。该行为非常意外。) 我通过尝试使用以下命令来清除队列中的所有消息,从而找到了这一点:C++ 为什么不显示消息框?,c++,mfc,C++,Mfc,我在一个MFC项目,有一个非常奇怪的窗口模式设置。我认为这个设置把一个消息框的显示方式搞砸了 发生的情况是,在按下ALT键之前,消息框将不可见 我仍在试图了解他们使用的窗口设置,但也许有人能给我一个线索,告诉我应该寻找什么 我编写了一个变通方法,将所有者窗口和消息框标题传递给一个类,该类生成一个线程,该线程遍历所有窗口,并找到一个消息框对话框,该对话框由指定所有者拥有,标题为指定。但是,我必须搜索并替换1000多个实例,才能使其在系统范围内正常工作 更好的选择是找到根本原因。但其复杂性相当令人望
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()
处理程序
事实证明,以前的程序员在构造cpaindc
对象之前,先放置if
x,然后return
条件。它的构造函数调用BeginPaint()
,从而验证无效区域。在不验证无效区域的情况下,系统继续生成WM_PAINT
消息,直到无效区域为空。这将导致消息队列永远不会为空
不确定这是否重要,但有问题的窗口和对话框之间的关系是它们在同一个线程中,在根应用程序窗口之外。有两种显示模式具有以下设置:
-ROOT -ROOT
+-CHILD +-MESSAGE BOX
+-MESSAGE BOX +-CHILD
+-CHILD +-CHILD
+-CHILD +-CHILD < Offender
+-CHILD < Offender +-CHILD
+-CHILD
-ROOT-ROOT
+-子+消息框
+-消息框+-子项
+-儿童+-儿童
+-儿童+-儿童<罪犯
+-儿童<罪犯+-儿童
+-孩子
这是由“功能”造成的,如果消息队列包含任何消息,它将不显示系统消息框。(请对该错误进行投票或评论。该行为非常意外。)
我通过尝试使用以下命令来清除队列中的所有消息,从而找到了这一点:
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()
处理程序
事实证明,以前的程序员在构造cpaindc
对象之前,先放置if
x,然后return
条件。它的构造函数调用BeginPaint()
,从而验证无效区域。在不验证无效区域的情况下,系统继续生成WM_PAINT
消息,直到无效区域为空。这将导致消息队列永远不会为空
不确定这是否重要,但有问题的窗口和对话框之间的关系是它们在同一个线程中,在根应用程序窗口之外。有两种显示模式具有以下设置:
-ROOT -ROOT
+-CHILD +-MESSAGE BOX
+-MESSAGE BOX +-CHILD
+-CHILD +-CHILD
+-CHILD +-CHILD < Offender
+-CHILD < Offender +-CHILD
+-CHILD
-ROOT-ROOT
+-子+消息框
+-消息框+-子项
+-儿童+-儿童
+-儿童+-儿童<罪犯
+-儿童<罪犯+-儿童
+-孩子
这可能是一个绘制/重画问题。@1201程序,因为这是一个常见的windows MessageBox,我不知道会是什么情况。您使用的是多监视器设置吗?消息框是否可以位于断开连接的监视器上?如何显示消息框?您正在将对话框窗口句柄传递给它吗?显示相同的故障模式。在该问答中,所有者窗口的WM_PAINT
-处理程序缺少BeginPaint
/EndPaint
调用。有了这些信息,我建议查看(或注释掉)所有者窗口的PreTranslateMessage
实现。按[Alt]键进入一个模式循环,一个系统提供的消息循环,绕过应用程序提供的循环(这可能是错误的)。这可能是一个绘制/重画问题。@1201程序,因为这是一个常见的windows MessageBox,我不知道会是什么情况。您使用的是多监视器设置吗?消息框是否可以位于断开连接的监视器上?如何显示消息框?您正在将对话框窗口句柄传递给它吗?显示相同的故障模式。在该问答中,所有者窗口的WM_PAINT
-处理程序缺少BeginPaint
/EndPaint
调用。有了这些信息,我建议查看(或注释掉)所有者窗口的PreTranslateMessage
实现。按[Alt]键进入一个模式循环,即系统提供的消息循环,它绕过了应用程序提供的循环(这可能是错误的)。如果您简要描述了有问题的窗口和对话框之间的关系,这可能对未来的访问者有用,这不会出现。如果您很快描述了有问题的窗口和对话框之间的关系,这可能会对未来的访问者有用,但不会出现。