当前位置:C++技术网 > 资讯 > GDI中矩形区域(含圆角矩形区域)的三种创建方法

GDI中矩形区域(含圆角矩形区域)的三种创建方法

更新时间:2016-01-22 23:21:58浏览次数:1+次

    我们在《GDI区域是什么意思?区域和矩形的关系是什么?》文中介绍了区域的概念,也介绍了区域和矩形的差别。这里就仔细说说矩形区域的创建方法。

    矩形区域分为一般矩形区域(也就是长方形的区域)和圆角矩形区域(长方形四个角不是直角,而是圆弧)。两种矩形区域的形状如下如所示:

普通矩形(直角矩形)和圆角矩形示意图

【普通矩形(直角矩形)和圆角矩形示意图】
    在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创建的圆角矩形区域

【椭圆宽为20,高为20创建的圆角矩形区域】
下面是代码:
HRGN hRoundRgn = CreateRoundRectRgn(50,50,200,100,20,20);
FillRgn(hdc,hRoundRgn,(HBRUSH)GetStockObject(DKGRAY_BRUSH));
DeleteObject(hRoundRgn);

    自然前面的两个函数代码更加简单,留给你来写。一定要记得,区域用完需要删除哦。创建矩形区域只是第一步,不要觉得这个不重要。矩形区域可以组合形成很多复杂的区域,矩形区域只是一个基石而已,基础而重要。