这是一个与我之前的问题相关的更具体的问题。
我有一个使用计时器的应用程序。代码的编写方式是我的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
)会导致阻止其他对话框创建。
谢谢。
答案 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())