什么是“控件半透明效果” ?
如下图所示,美图秀秀中间的四个按钮,边缘四个角都是透明的,呈现出椭圆效果:
熟悉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 我自绘了一个边角椭圆的按钮和编辑框 如下图所示: