【问题标题】:Why should the host window not have CS_HREDRAW and CS_VREDRAW window styles?为什么宿主窗口不应该有 CS_HREDRAW 和 CS_VREDRAW 窗口样式?
【发布时间】:2018-03-05 22:06:30
【问题描述】:

我正在阅读 SimpleRibbon 示例应用程序,并注意到源代码中有一条奇怪的行:

wcex.style          = 0;    // Don't use CS_HREDRAW or CS_VREDRAW with a Ribbon

我在 MSDN 或其他地方找不到任何参考来解释为什么这些窗口类不应在包含功能区的窗口中使用。有谁知道这是怎么回事?

干杯。

示例代码:GitHub Windows-classic-samples - SimpleRibbon.cpp

【问题讨论】:

  • CS_HREDRAW 位被设置时,水平尺寸的改变会导致整个窗口被重绘。未设置时,水平尺寸更改将导致仅绘制新暴露的区域。设置CS_VREDRAW 位的作用相同,但垂直大小会发生变化。我不熟悉 Windows 功能区框架,但我猜你不应该在每次窗口改变大小时重新绘制功能区。您是否尝试过设置这些位并查看会发生什么?
  • 在样本中并不明显而且有点苛刻。他们也许正试图让它看起来不错。期望功能区是您的主窗口的子类,因此它可以检测 WM_SIZE 等基本消息。有必要确保色带始终适合整个窗口。所以功能区控件本身不需要这些类样式。但是,如果您自己的应用程序不购买 D2D 等 DirectX 包装器,则它可能会这样做。所以忽略它,使用样式,看看有什么能打动粉丝。
  • GitHub 存储库的Issues 选项卡可能是要求澄清的更好地方。
  • 大概你会得到很多难看的闪烁。
  • 大家好,我在查看示例时遇到了这个问题。阅读您的 cmets 后,它提醒我在 CWnd 中使用 OpenGL 时在 WM_ERASEBKGND 上返回 FALSE。也许需要对功能区执行相同的技巧?

标签: winapi windows-ribbon-framework


【解决方案1】:

查看此链接http://www.catch22.net/tuts/win32/flicker-free-drawing

在调整我的自定义文本视图小部件的大小时,我遇到了可怕的闪烁。然后本教程告诉我删除 CS_HREDRAW 和 CSVREDRAW。我立即看到闪烁消失了!现在我的问题是,这些风格的目的到底是什么。因为他们只会做坏事。

请注意,Windows 7 修复了闪烁问题。因此,即使您的应用在 Windows Xp 上闪烁异常,它也不会在 Windows 7 上闪烁。

【讨论】:

  • Windows 7(和 Vista)在渲染时使用 DWM 和离屏表面。我认为这减少了闪烁的出现,因为该应用程序不会直接将像素绘制到屏幕上——在 vista/7 中使用 GDI 绘制实际上要慢得多。您仍然会闪烁,但速度要慢得多且不那么明显。
  • 但是是的,如果您的窗口具有非空背景画笔,我认为 CS_HREDRAW 和 CS_VREDRAW 在 Windows XP 和更早版本上调整窗口大小时会导致严重闪烁。另一方面,如果窗口大小发生变化,显然需要重绘窗口!您链接的文章是一个很好的讨论,我现在正在阅读,谢谢分享。
  • @fabspro 我很高兴分享,因为我很高兴学习。我至少能做的就是分享。不仅那篇文章很有趣,而且他的整个网站都是 win32 开发人员的金矿。它没有关于 win32 开发的一切,但它有很多。关于你的其他观点。您不需要 CS_HREDRAW|CS_VREDRAW 来重绘调整大小的窗口。这些样式会导致您的整个窗口无效,而不仅仅是实际无效的部分。即使您的 hbrBackground 画笔为空,这些样式也会导致严重闪烁。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多