C++ - 对话框问题
Posted
技术标签:
【中文标题】C++ - 对话框问题【英文标题】:C++ - Dialog box question 【发布时间】:2010-05-21 12:54:21 【问题描述】:这是一个更具体的问题,与我之前的问题有关。
我有一个使用计时器的应用程序。代码的编写方式是我的WM_TIMER
处理程序使用一些自定义消息处理程序调用DialogBoxParam(...)
(我们称之为DlgProc
)。
这是通过以下方式完成的:
案例 WM_TIMER: // 例程,显示一个特殊的消息框 显示消息框(...); 返回0;
现在,如果我让DlgProc
处理这样的消息(参见代码),这将导致大量对话框(每个WM_TIMER
调用一个)。
switch (msg)
case WM_INITDIALOG:
// (...)
return TRUE;
case WM_COMMAND:
// (...)
return TRUE;
return FALSE;
但是,如果我将一个虚拟的 WM_PAINT
处理程序 (return TRUE;
) 添加到我的 DlgProc
,这将导致恰好显示一个对话框和 100% 的 CPU 负载(那是因为我收到了大量的 @ 987654330@ 消息)。
问:
如果我希望我的应用程序只显示一个对话框并且没有用于 WM_PAINT 处理的 CPU 负载,可以在这里做什么? (我的意思是,具有类似于绘制唯一对话框并完全暂停父窗口的行为)。
如果有人解释在这种情况下实际发生的情况以及为什么我会在我的对话框中收到大量的WM_PAINT
消息以及为什么它们的处理(使用return TRUE
)会导致阻止其他对话框的创建,那就太好了.
谢谢。
【问题讨论】:
你是在代码中的某处调用 DefDlgProc 【参考方案1】:1) 如果您只想显示一个对话框,您应该在捕获第一个 WM_TIMER 信号后禁用计时器。您可以使用KillTimer() 来执行此操作。
2) Windows 希望使 GUI 保持最新。每当屏幕上的某个区域需要更新时,都会使用InvalidateRect 或 InvalidateRgn 使其无效。现在,对于每个“无效”的屏幕部分,都会调用 WM_PAINT 以再次“有效”。
如果您不这样做(或只是其中的一部分),Windows 将再次调用 WM_PAINT ... 一次又一次。一种方法是致电ValidateRect。在许多情况下,BeginPaint() 和 EndPaint() 用于完成这项工作。
3) 也许最重要的是:你不应该只返回 FALSE!对窗口尝试 DefWindowProc(),对对话框尝试 DefDlgProc()。他们还将适当地处理 WM_PAINT。
【讨论】:
永远不要从对话过程中调用 DefDlgProc。 DefDlgProc 是调用 DialogProc 的对话框窗口过程。【参考方案2】:不是你注册了WM_PAINT,一定是有什么原因导致的(即使你不加WM_PAINT:handler),找re/draw函数(比如InvalidateRect())
【讨论】:
以上是关于C++ - 对话框问题的主要内容,如果未能解决你的问题,请参考以下文章