矩形、区域和剪裁

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 用于将剪裁区域移动到客户区的另一部分。

posted on 2012-01-06 21:09 梦五 阅读(942) 评论(0)  编辑 收藏 引用 所属分类: Windows相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜