[MFC] 几种子控件半透明效果的实现办法

什么是“控件半透明效果” ?

如下图所示,美图秀秀中间的四个按钮,边缘四个角都是透明的,呈现出椭圆效果:



熟悉MFC开发的都知道 虽然四个按钮的边缘是椭圆的 实际上椭圆之外的角落 也属于子控件的窗口区域 

即:如下图所示 虽然子控件的四个角是椭圆 但是椭圆之外的区域(即黑框与黄框之间的区域) 也属于子控件的窗口区域


很多场景下 需要在子控件的区域显示其父窗口的画面 表现出“子控件的这个区域是透明的”

这个区域的UI如何绘制 就是实现这个UI效果的关键了


实现方法有哪些?


1、纯色背景

这也是最简单的方法 即父窗口的背景色 采用纯色背景  当绘制子控件时 先用对应的纯色FillRect 填充子控件的画布

这个方法简单 但应用场景限制太大:如果父窗口的背景色不是纯色 方法就无效了


2、拷贝父窗口对应区域的dc数据

当绘制子控件时 先拷贝父窗口对应区域的dc数据 用其填充子控件的画布

关键词:GetDC(GetParent())、BitBlt

但是有个问题 多次渲染后 发现子控件上有阴影问题 网上有这个bug的解决办法  

解决了阴影的bug 但依旧有使用限制:如果父窗口的背景变化了 子控件无法得到通知 
如何让子控件实时地收到通知? 可以参考CButtonST里面的逻辑 具体我已经忘记了 大家可以自己去看源码)


3、渲染父窗口时 保存父窗口的画布背景 

与方法2类似 依旧是画布拷贝 不过此时父窗口的画布获取 不再使用GetDC(GetParent()) 

具体办法:

a、渲染父窗口时 在父窗口类中 用数据成员HDC m_CanvasCache保存父窗口的背景

b、渲染子控件时 先用父窗口m_CanvasCache对应区域的数据 填充子控件的画布

按照方法3 我自绘了一个边角椭圆的按钮和编辑框 如下图所示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值