指定某个区域是可以被绘图

即指定某个区域是可以被绘图的。在这个区域以外的地方,绘图无效。即被会这个区域的边界给裁掉。只留下在区域内的图形。
CreateRectRgn   ()//创建矩形区域
CombineRgn   ()//合并两个区域
SelectClipRgn   ()//设定剪载区域

---------------

以下是《Windows程序设主》第五章的内容

建立和绘制剪裁区域
 

剪裁区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。剪裁区域可以用於绘制和剪裁,通过将剪裁区域选进装置内容,就可以用剪裁区域来进行剪裁(就是说,将可以绘图的范围限制为显示区域的一部分)。与画笔、画刷和点阵图一样,剪裁区域是GDI物件,您应该呼叫DeleteObject来删除您所建立的剪裁区域。

当您建立一个剪裁区域时,Windows传回一个该剪裁区域的代号,型态为HRGN。最简单的剪裁区域是矩形,有两种建立矩形的方法:

hRgn   =   CreateRectRgn   (xLeft,   yTop,   xRight,   yBottom)   ;
或者

hRgn   =   CreateRectRgnIndirect   (&rect)   ;
您也可以建立椭圆剪裁区域:

hRgn   =   CreateEllipticRgn   (xLeft,   yTop,   xRight,   yBottom)   ;
或者

hRgn   =   CreateEllipticRgnIndirect   (&rect)   ;
CreateRoundRectRgn建立圆角的矩形剪裁区域。

建立多边形剪裁区域的函式类似於Polygon函式:

hRgn   =   CreatePolygonRgn   (&point,   iCount,   iPolyFillMode)   ;
point参数是一个POINT型态的结构阵列,iCount是点的数目,iPolyFillMode是ALTERNATE或者WINDING。您还可以用CreatePolyPolygonRgn来建立多个多边形剪裁区域。

那么,您会问,剪裁区域究竟有什么特别之处?下面这个函式才真正显示出了剪裁区域的作用:

iRgnType   =   CombineRgn   (hDestRgn,   hSrcRgn1,   hSrcRgn2,   iCombine)   ;
这一函式将两个剪裁区域(hSrcRgn1和hSrcRgn2)组合起来并用代号hDestRgn指向组合成的剪裁区域。这三个剪裁区域代号都必须是有效的,但是hDestRgn原来所指向的剪裁区域被破坏掉了(当您使用这个函式时,您可能要让hDestRgn在初始时指向一个小的矩形剪裁区域)。

iCombine参数说明hSrcRgn1和hSrcRgn2如何组合,见表5-9。

表5-9  

iCombine值     新剪裁区域  
RGN_AND   两个剪裁区域的公共部分  
RGN_OR   两个剪裁区域的全部  
RGN_XOR   两个剪裁区域的全部除去公共部分  
RGN_DIFF   hSrcRgn1不在hSrcRgn2中的部分  
RGN_COPY   hSrcRgn1的全部(忽略hSrcRgn2)  

从CombineRgn传回的iRgnType值是下列之一:NULLREGION,表示得到一个空剪裁区域;SIMPLEREGION,表示得到一个简单的矩形、椭圆或者多边形;COMPLEXREGION,表示多个矩形、椭圆或多边形的组合;ERROR,表示出错了。

剪裁区域的代号可以用於四个绘图函式:

FillRgn   (hdc,   hRgn,   hBrush)   ;
FrameRgn   (hdc,   hRgn,   hBrush,   xFrame,   yFrame)   ;
InvertRgn   (hdc,   hRgn)   ;
PaintRgn   (hdc,   hRgn)   ;
FillRgn、FrameRgn和InvertRgn类似於FillRect、FrameRect和InvertRect。FrameRgn的xFrame和yFrame参数是画在区域周围的边框的宽度和高度。PaintRgn函式用装置内容中目前画刷填入所指定的区域。所有这些函式都假定区域是用逻辑座标定义的。

在您用完一个区域後,可以像删除其他GDI物件那样删除它:

DeleteObject   (hRgn)   ;
矩形与区域的剪裁
 

区域也在剪裁中扮演了一个角色。InvalidateRect函式使显示的一个矩形区域失效,并产生一个WM_PAINT讯息。例如,您可以使用InvalidateRect函式来清除显示区域并产生一个WM_PAINT讯息:

InvalidateRect   (hwnd,   NULL,   TRUE)   ;
您可以通过呼叫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为剪裁区域建立一份副本,所以在将它选进装置内容之後,使用者可以删除它。Windows还提供了几个对剪裁区域进行操作的函式,如ExcludeClipRect用於将一个矩形从剪裁区域里排除掉,IntersectClipRect用於建立一个新的剪裁区域,它是前一个剪裁区域与一个矩形的交,OffsetClipRgn用於将剪裁区域移动到显示区域的另一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值