C++ - 对话框问题

标签 c++ winapi modal-dialog

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

我有一个使用计时器的应用程序。代码的编写方式是我的 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/

相关文章:

c++ - "?"帮助按钮触发 WM_HELP _and_ WM_LBUTTONUP

c++ - 获取系统TEMP变量的路径

c++ - CDialog更新输入框值

javascript - 显示移动窗口时在 Bootstrap 导航栏中附加搜索栏?

c++ - 使用 std::equal 和相等运算符的比较

c++ - 如何将输入与文件中的内容匹配?我需要一个更好的解释。

c++ - 如何应对高频数据?

c++ - 使用 .ipp 扩展名和 .cpp 扩展名文件的区别

c++ - 扩展 Windows API 结构是否安全?

c# - 如何聚焦模式对话框单击 C# 中的通知图标?