背景
windows做绘制时,为了美观,常常将一些图片或者窗口的四个角做成圆角。例如QQ窗口:
圆角的实现方案总结
- 其实总结起来非常的简单,就两个步骤:
- 计算窗口的边界剪切域
- 通过windows API
SetWindowRgn
设置该窗口的剪切域
- 其实原理就是,设置好边界剪切域之后,windows会将边界剪切域中的像素都去掉。
步骤详解
1. 计算窗口的边界剪切域
- MFC中可利用
CRgn
类 - 使用
CreateRectRgn
创建边界剪切域- 可用
CreateRoundRectRgn
创建圆角矩形区域 CreateEllipticRgn
创建椭圆形剪切域CreatePolygonRgn
创建多边形剪切域
- 可用
- 使用
CombineRgn
来修改边界剪切域,常用的位操作如下:RGN_AND
RGN_OR
RGN_XOR
RGN_DIFF
RGN_COPY
2. 设置窗口的边界剪切域
-
使用
SetWindowRgn
API设置窗口的剪切域- 需传入参数:边界剪切域的句柄
HRGN
- 需传入参数:是否触发重绘
- 需传入参数:边界剪切域的句柄
-
上述两步骤,可以简单的理解为:
- 给windows窗口设置要被“剪掉”的区域
- 以后windows系统域每次重绘的时候,都会把这部分区域“剪掉”,这样就实现了圆角或者其他丰富形状的窗口