【问题标题】:Using UpdateLayeredWindow on a region of a window在窗口区域上使用 UpdateLayeredWindow
【发布时间】:2016-12-24 08:55:10
【问题描述】:

我正在使用 UpdateLayeredWindow 创建一个分层窗口,并且我已经为子控件实现了绘图逻辑。我的问题是,每次 uI 发生变化时,都需要重新绘制整个框架。我想知道是否有办法只重绘窗口的特定 CRect 或 CRgn(即,将相关的 CDC 传递到 UpdateLayeredWindow,但指定您想要被 invlidated 的 CRect)。

是否会使用 UpdateLayeredWindowIndirect,并将 UPDATELAYEREDWINDOWINFO 结构中的 prcDirty CRect 设置为控件的客户区,从而只更新该区域?

【问题讨论】:

    标签: c++ windows winapi


    【解决方案1】:

    psizepptSrc 参数可让您指定要更新的窗口部分。 UpdateLayeredWindow 不使用失效模型。它使用更新模型。

    【讨论】:

    • UpdateLayeredWindowIndirect 函数呢?它说 UPDATELAYEREDWINDOWINFO 参数中的 prcDirty RECT 用于指定这个,对吗?
    • 这在文档中有解释。 “要更新的区域,该参数可以为NULL,如果为非NULL,则仅从源DC更新此矩形中的区域。”它限制了更新区域。
    • 我知道医生说什么,我只是想要某种验证,证明这确实有效并产生了预期的效果。
    • 不清楚你想要获得什么效果。您谈论失效和更新,就好像它们是同一件事一样。您可以控制更新区域(哪些像素会因操作而改变)。您无法控制失效区域(哪些像素因更新而在屏幕上刷新)。但是你没有理由关心失效区域,因为你不是在画。
    • 如果您要评估性能,那么只有一种方法可以确定:尝试两种方法并进行比较。
    【解决方案2】:

    “UpdateLayeredWindow 总是更新整个窗口。要更新窗口的一部分,请使用传统的 WM_PAINT 并使用 SetLayeredWindowAttributes 设置混合值。” - http://msdn.microsoft.com/en-us/library/windows/desktop/ms633556(v=vs.85).aspx

    请阅读文档。请放心。

    【讨论】:

    • 我需要 UpdateLayeredWindow 提供的逐像素 alpha 混合功能。
    【解决方案3】:

    是否会使用 UpdateLayeredWindowIndirect,并将 UPDATELAYEREDWINDOWINFO 结构中的 prcDirty CRect 设置为控件的客户区,从而只更新该区域?

    是的。这正是它的作用。

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多