Windows 包含了几种使用 RECT(矩形)结构和“区域”的绘图函数。
区域就是屏幕上的一块地方,它是矩形、多边形和椭圆的结合。
矩形函数:
函数 |
功能 |
FillRect(hdc,&rect,hBrush); |
用指定画刷来填充矩形(直到但不包含 right 和 bottom 坐标),该函数不需要先将画刷选进设备描述表。 |
FrameRect(hdc,&rect,hBrush); |
使用画刷画矩形框,但是不填充矩形。 |
InvertRect(hdc,&rect); |
将矩形中所有像素反转,1转换成0,0转换成1。 |
SetRect(&rect,xLeft,yTop,xRight,yBottom); |
将 RECT 结构的4个字段设置为特定值。 |
OffsetRect(&rect,x,y); |
将矩形沿x轴和y轴移动几个单元。 |
InflateRect(&rect,x,y); |
增减矩形的尺寸。 |
SetRectEmpty(&rect); |
将矩形各字段设置为0。 |
CopyRect(&DestRect,&SrcRect); |
将矩形复制给另一个矩形。 |
IntersectRect(&DestRect,&SrcRect1,&SrcRect2); |
获取两个矩形的交集。 |
UnionRect(&DestRect,&SrcRect1,&SrcRect2); |
获取两个矩形的并集。 |
bEmpty = IsRectEmpty(&rect); |
确定矩形是否为空。 |
bInRect = PtInRect(&rect,point); |
确定点是否在矩形内。 |
创建和绘制区域
区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。区域可以用于绘制和剪裁,
通过将区域选进设备描述表,就可以用区域来进行剪裁(就是说,就可以将绘图的范围限制为客户区的一部分)。
与画笔、画刷和位图一样,区域是 GDI 对象,应该调用 DeleteObject 来删除创建的区域。
当创建一个区域时,Windows 返回一个该区域的句柄,类型为 HRGN。
最简单的区域是矩形,创建矩形区域的方法:
hRgn = CreateRectRgn(xLeft,yTop,xRight,yBottom);
或
hRgn = CreateRectRgnIndirect(&rect);
创建椭圆区域的方法:
hRgn = CreateEllipticRgn(xLeft,yTop,xRight,yBottom);
或
hRgn = CreateEllipticRgnIndirect(&rect);
创建圆角的矩形区域:CreateRoundRectRgn;
创建多边形区域的方法:
hRgn = CreatePolygonRgn(&point,iCount,iPolyFillMode);
创建多个多边形区域:CreatePolyPolygonRgn;
合成区域:
iRgnType = CombineRgn(hDestRgn,hSrcRgn1,hSrcRgn2,iCombine);
这一函数将两个源区域(hSrcRgn1 和 hSrcRgn2)组合起来并用句柄 hDestRgn 指向合成的目标区域。这三个区域句柄必须是有效的,但是 hDestRgn 所指向的原来的区域被破坏掉了(当你使用这个函数时,可能要让 hDestRgn 在初始时指向一个小的矩形区域)。
iCombine 参数说明 hSrcRgn1 和 hSrcRgn2 如何组合:
iCombine 值 |
新区域 |
RGN_AND |
两个源区域的公共部分 |
RGN_OR |
两个源区域的全部 |
RGN_XOR |
两个源区域的全部除去公共部分 |
RGN_DIEF |
hSrcRgn1 不在 hSrcRgn2 中的部分 |
RGN_COPY |
hSrcRgn1 的全部(忽略hSrcRgn2) |
从 CombineRgn 返回的 iRgnType 值是下列之一:
NULLREGION,表示得到一个空区域;
SIMPLEREGION,表示得到一个简单的矩形、椭圆或者多边形;
COMPLEXREGION,表示多个矩形、椭圆或多边形的组合;
ERROR,表示出错了。
删除区域:
DeleteObject(hRgn);
矩形与区域的剪裁:
区域也在剪裁中扮演了一个角色。InvalidateRect 函数使显示的一个矩形区域失效,并产生一个 WM_PAINT 消息。
InvalidateRect(hwnd,NULL,TRUE);
清空客户区,并产生一个 WM_PAINT 消息(在应用程序的消息队列中,最终由 Windows 调用应用程序的窗口过程函数来处理。)
可以通过调用 GetUpdateRect 来获取失效矩形的坐标,并且可以使用 ValidateRect 函数使客户区的矩形有效。
当接收到一个 WM_PAINT 消息时,无效矩形的坐标可以从 PAINTSTRUCT 结构中得到,该结构是用 BeginPaint 函数填充的。这个无效矩形还定义了一个“剪裁区域”,不能在剪裁区域外绘图。
Windows 有两个作用于区域而不是矩形的函数,它们类似于InvalidateRect 和 ValidateRect:
InvalidateRgn(hwnd,hRgn,bErase);
和
ValidateRgn(hwnd,hRgn);
当接收到一个由无效矩形引起的 WM_PAINT 消息时,剪裁区域不一定是矩形。
可以使用以下两个函数把区域选进设备描述表:
SelectObject(hdc,hRgn);
或
SelectClipRgn(hdc,hRgn);
通过将一个区域选进设备描述表来创建自己的剪裁区域,这个剪裁区域使用设备坐标。
GDI(图形设备接口)为剪裁区域建立一份副本,所以在将它选进设备描述表之后,用户可以删除它。
几个对剪裁区域进行操作的函数:
ExcludeClipRect 用于将一个矩形从剪裁区域里排除掉。
IntersectClipRect 用于创建一个新的剪裁区域,它是前一个剪裁区域与一个矩形的交集。
OffsetClipRgn 用于将剪裁区域移动到客户区的另一部分。