【问题标题】:On Win32, can I disable painting of a window for a period of time?在Win32上,我可以在一段时间内禁用窗口的绘制吗?
【发布时间】:2011-02-15 09:02:27
【问题描述】:

当我更改对话框的布局时,是否有一个功能会冻结窗口重绘一段时间?

【问题讨论】:

  • 我严重怀疑您是否需要这样做。您是否尝试过并确定您在调整对话框布局时实际上收到了大量WM_PAINT 消息?除非没有其他消息可供处理,否则 Windows 不会向窗口过程发送 WM_PAINT 消息。
  • @Cody 我相信您知道这一点,但 Windows 不会发送 WM_PAINT 消息,而是发布它们。非常重要的区别。

标签: c++ windows winapi wm-paint


【解决方案1】:

如果您发现您确实需要这样做,您应该向窗口发送WM_SETREDRAW message 并将wParam 设置为FALSE。这表示窗口内容更改后不应重绘。

如果您想重新启用绘图,请发送另一条 WM_SETREDRAW 消息,这次将 wParam 设置为 TRUE。

示例代码:

// Disable window updates
SendMessage(hWnd, WM_SETREDRAW, FALSE, 0);

// Perform your layout here
// ...

// Re-enable window updates
SendMessage(hWnd, WM_SETREDRAW, TRUE, 0);

如需了解更多信息,Raymond Chen's blog article on the subject 非常适合阅读。

【讨论】:

  • @Cody Gray,谢谢,我需要这样做,因为应用程序是使用 SkinCrafter 进行皮肤的,并且因为我们在属性页上遇到了问题,所以我基本上有一些像标签一样的图片按钮,当用户按其中一个我通过显示/隐藏/移动所有小部件更改为该选项卡。
  • @satuon:呃。有你的问题。您正在使用像皮肤库这样的可怕废话。事情的外观和工作方式与预期不符,这不足为奇。
  • @cody-gray 这对子窗口有效吗,还是我也需要将这些消息发送到每个子窗口?
  • @satuon:是的,它适用于子窗口,只要您向它们发送消息。他们与父母分开重绘。
  • 当我将此代码添加到我的布局函数时出现了一个小问题,任务栏图标没有显示(我在 Windows 7 上),但我已通过确保修复它WM_SETREDRAW 消息在第一次调用函数时没有使用,这是在第一次显示对话框之前。
【解决方案2】:

您应该一口气完成重新定位;使用BeginDeferWindowPos等。

【讨论】:

    【解决方案3】:

    Windows 绘画的方式是系统发布您的窗口WM_PAINT 消息,指示您绘画。如果您愿意,您可以选择在修改布局时忽略这些消息,然后在完成修改布局后强制执行绘制周期。

    但是,我在 Windows 上编写 UI 的经验是,您通常不需要采取这些步骤。由于您负责抽取消息队列,如果在修改布局的过程中窗口正在刷新,那么您一定采取了导致消息队列被抽取的操作。

    简单地说,在修改布局的同时停止排队,你的问题就会消失。

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2010-11-21
      • 2011-07-06
      • 1970-01-01
      • 2011-09-29
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多