Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不显示消息框?_C++_Mfc - Fatal编程技术网

C++ 为什么不显示消息框?

C++ 为什么不显示消息框?,c++,mfc,C++,Mfc,我在一个MFC项目,有一个非常奇怪的窗口模式设置。我认为这个设置把一个消息框的显示方式搞砸了 发生的情况是,在按下ALT键之前,消息框将不可见 我仍在试图了解他们使用的窗口设置,但也许有人能给我一个线索,告诉我应该寻找什么 我编写了一个变通方法,将所有者窗口和消息框标题传递给一个类,该类生成一个线程,该线程遍历所有窗口,并找到一个消息框对话框,该对话框由指定所有者拥有,标题为指定。但是,我必须搜索并替换1000多个实例,才能使其在系统范围内正常工作 更好的选择是找到根本原因。但其复杂性相当令人望

我在一个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]键进入一个模式循环,即系统提供的消息循环,它绕过了应用程序提供的循环(这可能是错误的)。如果您简要描述了有问题的窗口和对话框之间的关系,这可能对未来的访问者有用,这不会出现。如果您很快描述了有问题的窗口和对话框之间的关系,这可能会对未来的访问者有用,但不会出现。