当绘制包含每像素alpha通道的位图的子控件时,每当需要重绘时,我们都会产生相当多的闪烁。 实际的混合工作正常。 我发现了很多关于减less闪烁的信息(比如这个问题或者这个网站 ),但是我似乎无法find任何适用于这种情况的东西。
例如,我有一个button,它具有几个不同的位图,这些位图按照button的状态进行了alpha混合和blitting到窗口。 当他们的状态改变,我需要绘制一个不同的位图,我需要重新绘制背景,否则它混合从前一个状态的位图遗留的像素。 这是我正在闪烁的地方,偶尔会有一些背景被撕裂。
通过使顶级父窗口绘制位图背景而不是纯色,以及使子控件重叠的可能性,使问题变得更复杂; 只是将基础颜色乘以孩子的位图是WS_CLIPCHILDREN
,就像使用WS_CLIPCHILDREN
。
由于窗口具有位图背景,因此我将在WM_ERASEBKGND
上返回true
,以避免绘制只会被覆盖的颜色。
当然,双缓冲似乎可以解决所有这些问题,但是我一直无法使它正常工作。 我为顶层窗口设置了WS_COMPOSITED
,为子窗口设置了WS_COMPOSITED
。 当需要重新绘制一个新的位图的子窗口时,我遇到了一些问题(很可能是因为我不了解绘制顺序在这种情况下如何工作):
InvalidateRect()
并传递子句柄,那么子窗口确实会重绘,但是不会重画背景,所以像素会相互堆叠,混合在一起。 InvalidateRect()
并传入父级句柄,并且由一个由子窗口尺寸组成的矩形,则会重绘背景,但是子窗口不是。 InvalidateRect()
两次似乎非常恶心,因为我猜测每次调用都可能导致缓冲区翻转,从而破坏目的)。 我得出的结论是,我并不真正了解如何修改我的程序来处理双缓冲,或者双缓冲甚至可以帮助解决这种情况。 我觉得肯定会,但我不太了解我需要修改的东西,让一切再次打好。
你在使用分层的窗口吗? 如果没有,也许试试看。
对于双缓冲也考虑这种技术 。
这可能是完全脱离基地 – 我的贵日很久以前…
但是,难道你不能预先计算你的不同状态的混合? 我假设你的按钮可以启用/禁用和上/下,所以这只有4个组合。 为什么不预先计算组合的位图?
还是问题已经组合的位图与现有状态的交互?