六、矩形、区域和剪裁—建立和绘制剪裁区域
剪裁区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。剪裁区域可以用于绘制和剪裁,通过将剪裁区域选进设备内容,就可以用剪裁区域来进行剪裁(就是说,将可以绘图的范围限制为显示区域的一部分)。与画笔、画刷和位图一样,剪裁区域是GDI对象,您应该呼叫DeleteObject来删除您所建立的剪裁区域。
当您建立一个剪裁区域时,Windows传回一个该剪裁区域的句柄,型态为HRGN。最简单的剪裁区域是矩形,有两种建立矩形的方法:
或者
您也可以建立椭圆剪裁区域:
或者
CreateRoundRectRgn建立圆角的矩形剪裁区域。
建立多边形剪裁区域的函数类似于Polygon函数:
point参数是一个POINT型态的结构数组,iCount是点的数目,iPolyFillMode是ALTERNATE或者WINDING。您还可以用CreatePolyPolygonRgn来建立多个多边形剪裁区域。
那么,您会问,剪裁区域究竟有什么特别之处?下面这个函数才真正显示出了剪裁区域的作用:
这一函数将两个剪裁区域(hSrcRgn1和hSrcRgn2)组合起来并用句柄hDestRgn指向组合成的剪裁区域。这三个剪裁区域句柄都必须是有效的,但是hDestRgn原来所指向的剪裁区域被破坏掉了(当您使用这个函数时,您可能要让hDestRgn在初始时指向一个小的矩形剪裁区域)。
iCombine参数说明hSrcRgn1和hSrcRgn2如何组合,见表5-9。
从CombineRgn传回的iRgnType值是下列之一:NULLREGION,表示得到一个空剪裁区域;SIMPLEREGION,表示得到一个简单的矩形、椭圆或者多边形;COMPLEXREGION,表示多个矩形、椭圆或多边形的组合;ERROR,表示出错了。
剪裁区域的句柄可以用于四个绘图函数:
FillRgn、FrameRgn和InvertRgn类似于FillRect、FrameRect和InvertRect。FrameRgn的xFrame和yFrame参数是画在区域周围的边框的宽度和高度。PaintRgn函数用设备内容中目前画刷填入所指定的区域。所有这些函数都假定区域是用逻辑坐标定义的。
在您用完一个区域后,可以像删除其它GDI对象那样删除它:
当您建立一个剪裁区域时,Windows传回一个该剪裁区域的句柄,型态为HRGN。最简单的剪裁区域是矩形,有两种建立矩形的方法:
hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
hRgn = CreateRectRgnIndirect (&rect) ;
hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;
hRgn = CreateEllipticRgnIndirect (&rect) ;
建立多边形剪裁区域的函数类似于Polygon函数:
hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;
那么,您会问,剪裁区域究竟有什么特别之处?下面这个函数才真正显示出了剪裁区域的作用:
iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;
iCombine参数说明hSrcRgn1和hSrcRgn2如何组合,见表5-9。
表5-9 |
iCombine值 | 新剪裁区域 |
RGN_AND | 两个剪裁区域的公共部分 |
RGN_OR | 两个剪裁区域的全部 |
RGN_XOR | 两个剪裁区域的全部除去公共部分 |
RGN_DIFF | hSrcRgn1不在hSrcRgn2中的部分 |
RGN_COPY | hSrcRgn1的全部(忽略hSrcRgn2) |
剪裁区域的句柄可以用于四个绘图函数:
FillRgn (hdc, hRgn, hBrush) ; FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame) ; InvertRgn (hdc, hRgn) ; PaintRgn (hdc, hRgn) ;
在您用完一个区域后,可以像删除其它GDI对象那样删除它:
DeleteObject (hRgn) ;