C ++ - 对话框问题

时间:2010-05-21 12:54:22

标签: c++ winapi modal-dialog

这是一个与我之前的问题相关的更具体的问题。

我有一个使用计时器的应用程序。代码的编写方式是我的WM_TIMER处理程序使用一些自定义消息处理程序调用{​​{1}}(让我们称之为DialogBoxParam(...))。

这可以通过以下方式完成:

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

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

WM_TIMER

但是如果我向我的 switch (msg) { case WM_INITDIALOG: // (...) return TRUE; case WM_COMMAND: // (...) return TRUE; return FALSE; } 添加一个虚拟WM_PAINT处理程序(return TRUE;),则会产生一个显示的DialogBox和100%CPU负载(这是因为我收到了大量DlgProc条消息。

问:

如果我希望我的应用程序只显示一个对话框并且没有用于WM_PAINT处理的CPU负载,那么可以在这做什么? (我的意思是,行为类似于绘制唯一对话框并完全暂停父窗口)

如果有人解释在这种情况下实际发生了什么,以及为什么我会在对话框中收到大量的WM_PAINT消息以及为什么他们的处理(使用WM_PAINT)会导致阻止其他对话框创建。

谢谢。

2 个答案:

答案 0 :(得分:3)

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

执行此操作

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

如果你不这样做(或者只是它的一部分),Windows将再次调用WM_PAINT ......一种方法是致电ValidateRect。在许多情况下,BeginPaint()和EndPaint()用于完成工作。

3)也许最重要的是:你不应该只返回FALSE!尝试使用Windows的DefWindowProc()和对话框的DefDlgProc()。他们还会适当地照顾WM_PAINT。

答案 1 :(得分:0)

这不是你注册WM_PAINT,必须引起它(即使你不添加WM_PAINT:handler),寻找re / draw函数(如InvalidateRect())

相关问题