最近研究控件设计,其中一个要求是建立透明的cstatic控件,一般方法使用:步骤(1)OnCtlColor中设置透明背景,会带来文字重叠;所以步骤(2)刷新文字时进行InvalidateRect强制重绘文字区域,会带来闪烁;所以步骤(3)使用双缓冲等方式减弱闪烁。
试过网上找到的多种方法,均不能有效的消除闪烁。虽然不影响整体使用,但是看着不舒服,所以就想到了另外一种方法:用父窗口的底图截图来作为控件的背景,就可以使控件本身在父窗口上“透明”,是一种假的隐身。
前提:1.父窗口是加载了背景底图的;2.控件在父窗口中。
步骤(1)创建一个父窗口,OnPaint()中加载底图,函数BitBlt;
步骤(2)创建一个CStatic的派生类,设置自绘模式;Create中传递父窗口的底图信息;DrawItem中进行重绘底图设置、其他重绘,函数BitBlt,注意函数中的位置信息应该是控件的x、y和width、height。
示例 :红色文字为自定义控件,可是实现透明无重叠无闪烁。如图1 所示。