透明窗口的实现

这里的透明窗口指的是 透明子窗口。具体应用是 透明按钮。就是 在按钮上贴上位图,位图与按钮的父窗口背景融合。实现透明效果。
(1)强制父窗口重绘
     父窗口不能设置CLIPCHILD属性,因为只要父窗口重绘,子窗口(按钮)也需要重绘。如果是父窗口

的重绘引发的子窗口重绘,那么需要把按钮的WM_ERASEBKGND消息处理中返回true,表示已经刷新背景,

当然实际是没有的。这样在按钮上贴位图之前显存区域存有的就是父窗口的背景。之后在按钮的

WM_PAINT消息中绘制位图就可以了,关键是要使用适当的光栅操作码(bitblt或者stretchbit)。
另一种如果是按钮自身引发的重绘,那么就要强制父窗口重绘按钮所在区域,而父窗口重绘这个区域后又会使按钮发生重绘,应该会是死循环。所以要使用说明机制来判断按钮的重绘消息是以上两种的哪一种。
(2)背景区域保留
    这个是我看网上的一些人的做法。也是要把按钮的WM_ERASEBKGND消息处理中返回true,表示已经刷新

背景(实际没有)。然后把父窗口中按钮位置的背景作为一块内存位图保留下来(有相应的函数),然

后,每次绘制按钮的时候先绘制这个保留的内存位图,然后再绘制按钮位图,关键也是要使用适当的光

栅操作码(bitblt或者stretchbit)。不过这种方法比较麻烦,因为按钮位置,大小,父窗口的背景,

父窗口的大小,都可能变动,那么保留的内存位图就不在是按钮位置对应的父窗口背景区域。
(3)贴部分位图
    这个方法,比较明确。我们知道了按钮在父窗口中的位置和大小,那么我们就可以准确定位父窗口背景图片中和按钮位置重叠的部分(比例问题)。这样,每次在重绘按钮的时候,先绘制这个重叠部分,然后再绘制按钮上的位图,使用正确的光栅操作码。

(4)背景区域动态保留

    和(2)背景区域保留 基本一样,唯一不同的是,父窗口的背景区域是动态获取的,因为由于各种情况的重绘,按钮区域的父窗口背景是会改变的,为此每当按钮需要重绘的时候,就先获取父窗口的背景,然后把父窗口的背景中和按钮对应的区域截取出来贴在按钮上,然后再贴按钮真正的位图。这种情况最有实用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值