矩形区域分为一般矩形区域(也就是长方形的区域)和圆角矩形区域(长方形四个角不是直角,而是圆弧)。两种矩形区域的形状如下如所示:
【普通矩形(直角矩形)和圆角矩形示意图】
在GDI中,区域的使用首先需要创建,这个和矩形不一样。矩形只需要Rectangle函数就可以绘制了。而区域则需要先创建,创建成功后返回区域的句柄,然后通过这个句柄来操作区域。创建普通矩形区域的函数有:
1. CreateRectRgn 创建矩形区域
2. CreateRectRgnIndirect 间接创建矩形区域
普通矩形的创建函数参数很简单,和Rectangle函数的参数一样,即左上角和右下角的坐标值。CreateRectRgn函数则直接传入四个值,分别是左顶右底。左顶就是左上角的XY坐标值,右底就是右下角的XY坐标值。
不过这样参数比较多,如果你有一个RECT结构体的变量,变量里存储了矩形的四个值,那就可以使用CreateRectRgnIndirect函数,只要传入RECT结构体变量的地址即可。
以上两个函数创建矩形区域的效果一样,只是参数形式不同罢了。两个函数都返回创建好的矩形区域的句柄。
到此,普通矩形区域创建完毕!
我们再来看看圆角矩形区域的创建,创建圆角矩形区域的函数为:
CreateRoundRectRgn 创建圆角矩形区域。
圆角矩形和普通矩形的区别就在于四个角是圆弧状的。所以也就复杂了点。而基本的矩形形状,还是由两个点来确定,这个和普通的矩形区域的创建参数一致。
我们来看看CreateRoundRectRgn函数的声明:
HRGN CreateRoundRectRgn(
int nLeftRect, // 左上角X值
int nTopRect, // 左上角Y值
int nRightRect, // 右下角X值
int nBottomRect, // 右下角Y值
int nWidthEllipse, // 椭圆的宽度
int nHeightEllipse // 椭圆的高度);
前面四个参数和CreateRectRgn的四个参数顺序和意义一致。后面两个参数决定了圆角矩形角的圆滑程度的。这个角的弧线是椭圆与矩形的两个边的两个切点之间的一段弧线段。如果椭圆的宽度和高度相等,则弧线为正圆的边。如果椭圆的高度和宽度不相等,则形成的是非正圆的椭圆弧线。这两个值越大,弧线越明显。如果椭圆的宽度和高度超过一个值,则圆角矩形就成了一个椭圆了。如果两个值有一个为0,则圆角椭圆就不存在,那就是一个普通直角矩形了。
这里说的是圆角矩形区域的形状实现。因为最后两个参数大家比较陌生,就多说了几句。你可以试着改变下最后两个值来感觉效果。
下面是我们用椭圆宽为20,高为20创建的圆角矩形区域的样子。我填充了矩形。
【椭圆宽为20,高为20创建的圆角矩形区域】
下面是代码:HRGN hRoundRgn = CreateRoundRectRgn(50,50,200,100,20,20);
FillRgn(hdc,hRoundRgn,(HBRUSH)GetStockObject(DKGRAY_BRUSH));
DeleteObject(hRoundRgn);
自然前面的两个函数代码更加简单,留给你来写。一定要记得,区域用完需要删除哦。创建矩形区域只是第一步,不要觉得这个不重要。矩形区域可以组合形成很多复杂的区域,矩形区域只是一个基石而已,基础而重要。