这是一个更具体的问题,与我之前的问题有关。
我有一个使用计时器的应用程序。代码的编写方式是我的 WM_TIMER
处理程序使用一些自定义消息处理程序调用 DialogBoxParam(...)
(我们称之为 DlgProc
) .
这是通过以下方式完成的:
案例 WM_TIMER: { //例程,显示一个特殊的消息框 显示消息框(...); 返回 0;
现在,如果我让 DlgProc
像这样处理消息(参见代码),这将导致大量对话框(每个 WM_TIMER
调用一个)。
switch (msg)
{
case WM_INITDIALOG:
// (...)
return TRUE;
case WM_COMMAND:
// (...)
return TRUE;
return FALSE;
}
但是如果我向我的 DlgProc
添加一个虚拟的 WM_PAINT
处理程序(return TRUE;
),这会导致恰好显示了一个对话框和 100% 的 CPU 负载(那是因为我收到了大量的 WM_PAINT
消息)。
问:
如果我希望我的应用程序只显示一个对话框并且没有 CPU 负载用于 WM_PAINT 处理,可以在这里做什么? (我的意思是,具有类似于绘制独特对话框并完全暂停父窗口的行为)。
此外,如果有人解释在这种情况下实际发生了什么,为什么我会收到大量的 WM_PAINT
消息到我的对话框以及为什么处理它们(使用 return TRUE
) 导致无法创建其他对话框。
谢谢。
最佳答案
1) 如果您只想显示一个对话框,您应该在捕捉到第一个 WM_TIMER 信号后禁用计时器。您可以使用 KillTimer() 执行此操作.
2) Windows 希望使 GUI 保持最新。每当屏幕上的区域应该更新时,使用 InvalidateRect 使它无效或 InvalidateRgn。现在,对于每个“无效”的屏幕部分,都会调用 WM_PAINT 以使其再次“有效”。
如果您不这样做(或只是其中的一部分),Windows 将再次调用 WM_PAINT ……一次又一次。一种方法是调用 ValidateRect .在许多情况下BeginPaint()和 EndPaint() 用于完成这项工作。
3) 也许最重要的是:你不应该只返回 FALSE!为窗口尝试 DefWindowProc(),为对话框尝试 DefDlgProc()。他们还将适本地处理 WM_PAINT。
关于C++ - 对话框问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882177/