繁体   English   中英

C ++-对话框问题

[英]C++ - Dialog box question

这是与我上一个问题有关的更具体的问题。

我有一个使用计时器的应用程序。 代码是通过我的WM_TIMER处理程序通过一些自定义消息处理程序(称为DlgProc )调用DialogBoxParam(...)的方式编写的。

可以通过以下方式完成此操作:

case WM_TIMER:{//例程,显示一个特殊的消息框DisplayMessageBox(...); 返回0; }

现在,如果我让DlgProc处理此类消息(请参见代码),这将导致大量对话框(每个WM_TIMER调用一个)。

   switch (msg)
   {
   case WM_INITDIALOG:
      // (...)
      return TRUE;
   case WM_COMMAND:
      // (...)
      return TRUE;
   return FALSE;
   }

但是,如果我在DlgProc添加了一个虚拟WM_PAINT处理程序( return TRUE; ),这将导致显示的DialogBox和100%的CPU负载正好(这是因为我收到了大量的WM_PAINT消息)。

问:

如果我希望我的应用程序准确显示一个对话框并且没有WM_PAINT处理的CPU负载,该怎么办? (我的意思是,有类似的行为来绘制唯一的对话框并完全暂停父窗口)

同样,如果有人解释在这种情况下实际发生的情况以及为什么我会在对话框中收到成千上万的WM_PAINT消息,以及为什么它们的处理(带有return TRUE )会导致阻止其他对话框的创建,那也很好。

谢谢。

1)如果只想显示一个对话框,则应在捕获第一个WM_TIMER信号后禁用计时器。 您可以使用KillTimer()做到这一点。

2)Windows希望保持GUI为最新。 每当屏幕上的区域应更新时,使用InvalidateRect或InvalidateRgn都会使该区域无效。 现在,对于每个“无效”屏幕部分,都会调用WM_PAINT以便再次使“有效”。

如果您不执行(或仅执行部分操作),则Windows将再次调用WM_PAINT。 一种方法是调用ValidateRect 在许多情况下,使用BeginPaint()和EndPaint()来完成这项工作。

3)也许最重要:您不应该只返回FALSE! 对于Windows,请尝试DefWindowProc();对于对话框,请尝试DefDlgProc()。 他们还将适当地照顾WM_PAINT。

不是您注册了WM_PAINT,而是一定要引起它(即使您没有添加WM_PAINT:处理程序),也要查找重新绘制函数(例如InvalidateRect())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM