闪烁的alpha通道的子窗口

当绘制包含每像素alpha通道的位图的子控件时,每当需要重绘时,我们都会产生相当多的闪烁。 实际的混合工作正常。 我发现了很多关于减less闪烁的信息(比如这个问题或者这个网站 ),但是我似乎无法find任何适用于这种情况的东西。

例如,我有一个button,它具有几个不同的位图,这些位图按照button的状态进行了alpha混合和blitting到窗口。 当他们的状态改变,我需要绘制一个不同的位图,我需要重新绘制背景,否则它混合从前一个状态的位图遗留的像素。 这是我正在闪烁的地方,偶尔会有一些背景被撕裂。

通过使顶级父窗口绘制位图背景而不是纯色,以及使子控件重叠的可能性,使问题变得更复杂; 只是将基础颜色乘以孩子的位图是WS_CLIPCHILDREN ,就像使用WS_CLIPCHILDREN

由于窗口具有位图背景,因此我将在WM_ERASEBKGND上返回true ,以避免绘制只会被覆盖的颜色。

当然,双缓冲似乎可以解决所有这些问题,但是我一直无法使它正常工作。 我为顶层窗口设置了WS_COMPOSITED ,为子窗口设置了WS_COMPOSITED 。 当需要重新绘制一个新的位图的子窗口时,我遇到了一些问题(很可能是因为我不了解绘制顺序在这种情况下如何工作):

  • 如果我调用InvalidateRect()并传递子句柄,那么子窗口确实会重绘,但是不会重画背景,所以像素会相互堆叠,混合在一起。
  • 如果我调用InvalidateRect()并传入父级句柄,并且由一个由子窗口尺寸组成的矩形,则会重绘背景,但是子窗口不是。
  • 如果我同时做了以上两个,那么背景和子窗口都会被重画,而且看起来和我想要的完全一样 – 除了这样做之外,我已经设法让它再次闪烁 (不是这样,这真的让人感到意外,因为这样调用InvalidateRect()两次似乎非常恶心,因为我猜测每次调用都可能导致缓冲区翻转,从而破坏目的)。

我得出的结论是,我并不真正了解如何修改我的程序来处理双缓冲,或者双缓冲甚至可以帮助解决这种情况。 我觉得肯定会,但我不太了解我需要修改的东西,让一切再次打好。

你在使用分层的窗口吗? 如果没有,也许试试看。

对于双缓冲也考虑这种技术 。

这可能是完全脱离基地 – 我的贵日很久以前…

但是,难道你不能预先计算你的不同状态的混合? 我假设你的按钮可以启用/禁用和上/下,所以这只有4个组合。 为什么不预先计算组合的位图?

还是问题已经组合的位图与现有状态的交互?