在这里只讨论与自绘控件里实现无效区域透明的相关方面,自绘控件的其他方面暂且不论。这里所说的控件无效区域透明是指在控件的无效区域里显示的是父窗口本应显示的效果,即没有此控件时父窗口的显示效果。
先说明几种我在网上查找到的方法:
1,让自绘控件的背景色与父窗口的背景色一致。
在很多情况下这绝对是一种很高效快捷的方法,因为在子控件中获取父窗口的背景以及设置子控件的背景太容易了。不过在一些有点特殊要求的项目里面这种方法就失去作用了。比如父窗口的背景是一张图片,下面第2种方法可以部分解决这个问题。
2,截取父窗口背景图片中指定区域作为自绘控件的背景。
这种方法编写的自绘控件需要应用在一种很定制的程序中,不具有通用性。因为这种方法需要自绘控件也能获取父窗口的背景图片并进行操作,如果不是定制的程序和控件,这几乎是不可能。因为我不知道到底能不能,所以话还是不说绝了~。
除了通用性问题,该方法还有一个问题,就是图片不能进行拉伸,拉伸后父窗口与自绘控件获取的区域就不一致了。当然解决这个问题也很简单,在自绘控件中获取父窗口客户区大小,然后对背景图片也进行同样的拉伸。
还有很多不知道的方法等等。。。
下面说说我这里讨论的方法,这个方法其实也有很多人在应用,很多人也在问这种方法,因为这种方法有很多细节方面不太好处理。
这种方法的主要原理如下:
在绘制自己的控件时先获取父窗口中本身应显示的效果,将该显示效果作为自绘控件的背景,然后在该背景上再进行控件的其他绘制操作。
1,获取父窗口对应区域效果并作为绘制控件的背景。
获取父窗口 CDC 可以如下:
GetParent()->GetDC();
示例代码如下:
在重写的 DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 里,只贴出了相关的代码,

本文探讨如何在自绘控件中实现无效区域透明,包括获取父窗口背景并作为自绘控件背景,处理控件状态变化时的背景重绘问题,以及避免屏幕闪烁的解决方案。
最低0.47元/天 解锁文章
1060

被折叠的 条评论
为什么被折叠?



