背景

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. 设置窗口的边界剪切域

使用SetWindowRgnAPI设置窗口的剪切域

需传入参数:边界剪切域的句柄HRGN

需传入参数:是否触发重绘

上述两步骤,可以简单的理解为:

给windows窗口设置要被“剪掉”的区域

以后windows系统域每次重绘的时候,都会把这部分区域“剪掉”,这样就实现了圆角或者其他丰富形状的窗口

参考连接

SetWindowRgn

SetWindowRgn函数的应用——绘制个性化形状的窗口

C++/MFC-GDI绘图之CRgn区域,CFile