《Windows程序设计》读书笔记------------->>矩形、区域和剪裁<<

本节内容介绍了有关矩形和对这个矩形的一系列操作。

一个矩形其实就是一个RECT的结构 

typedef  struct  _RECT 
  LONG left; 
  LONG top; 
  LONG right; 
  LONG bottom; 
}
 RECT,  * PRECT; 

这个结构就包含如下图所示的1,2点的x和y坐标:

一般情况下通过这个代码所示范的方式进行设定:

rect.left           =  xLeft ;        
rect.top           
=  xTop ;
rect.right         
=  xRight ;
rect.bottom        
=  xBottom ;

不过呢,这样很麻烦,下面一些函数有助于使用这个结构:

/*
SetRect函数用于设定矩形的坐标,这个函数会要求左上和右下的坐标以填充RECT结构。
*/

BOOL SetRect(
  LPRECT lprc, 
//  rectangle
   int  xLeft,    //  left side
   int  yTop,     //  top side
   int  xRight,   //  right side
   int  yBottom   //  bottom side
);

---------------------------------------------------------------其他的函数------------------------------------------------------------------

/*
将矩形沿x轴和y轴移动几个单元
*/
BOOL OffsetRect(
  LPRECT lprc,  
//  rectangle
   int  dx,        //  horizontal offset
   int  dy         //  vertical offset
);

 

/*
InflateRect函数用于增加或减小矩形的高度或者宽度。其中dx会增加左右方向的大小,dy会增加上下方向的大小,而且dx和dy会受到符号的限制,如果他们为负,那么将会减小这个矩形。
*/
BOOL InflateRect(
  LPRECT lprc,  
//  rectangle
   int  dx,        //  amount to adjust width
   int  dy         //  amount to adjust height
);

 

/*
SetRectEmpty函数用于将任何的矩形的坐标大小设置为0
*/
BOOL SetRectEmpty(
  LPRECT lprc   
//  rectangle
);

 

/*
CopyRect函数用于将一个矩形复制到另外一个
*/
BOOL CopyRect(
  LPRECT lprcDst,      
//  destination rectangle
  CONST RECT *  lprcSrc   //  source rectangle
);

 这个也可以简单的通过DestRect = SrcRect ;来简单的实现

/*
取得两个矩形的交集
*/
BOOL IntersectRect(
  LPRECT lprcDst,        
//  intersection buffer
  CONST RECT  * lprcSrc1,   //  first rectangle
  CONST RECT  * lprcSrc2    //  second rectangle
);

 

/*
取得两个矩形的联集,一个联集就是一个包含了两个矩形的最小矩形。
*/
BOOL UnionRect(
  LPRECT lprcDst,        
//  destination rectangle
  CONST RECT  * lprcSrc1,   //  first rectangle
  CONST RECT  * lprcSrc2    //  second rectangle
);

 

/*
IsRectEmpty函数用于判断矩形是否为空,一个空的矩形就是不包含任何内容的矩形。也就是说,矩形的左边比右边大,或者上边比下边大。
*/

BOOL IsRectEmpty(
  CONST RECT 
* lprc    //  rectangle
);

 

/*
PtInRect函数用于判断点是否在一个矩形里面,注意,如果一个点在矩形的左边或者上边上,那么点就在矩形中,而如果在下边或者右边就认为不在矩形里面。
*/
BOOL PtInRect(
  CONST RECT 
* lprc,   //  rectangle
  POINT pt            //  point
);

 


 

然后就是教你怎么使用PeekMessage函数拉。不过好久没有动手了。。。错另一个很白吃地方,建议认真看看书,都很重要!那个画真的很快。。。。乱七八糟的看得,因为没有办法解图了,自己运行一下看吧。

http://dl2.csdn.net/down4/20070724/24231357954.rar

 


 

下面就是裁减区域的介绍,裁减区域我的理解就是像PS里面那个选区,你可以对选区进行操作。选区保存HRGN这个句柄中。在与画笔、画刷和位图一样,剪裁区域是GDI对象,您应该呼叫DeleteObject来删除您所建立的剪裁区域。这部分内容可以参照ms-help://MS.MSDNQTR.2003FEB.2052/gdi/regions_7ab7.htm

最简单的剪裁区域是矩形,有两种建立矩形的方法:

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) ;
操作两个剪裁:
 
 
iRgnType  =  CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;
你可以通过设定iCombine来设定怎么操作:
  
  

iCombine值

新剪裁区域

RGN_AND

两个剪裁区域的公共部分

RGN_OR

两个剪裁区域的全部

RGN_XOR

两个剪裁区域的全部除去公共部分

RGN_DIFF

hSrcRgn1不在hSrcRgn2中的部分

RGN_COPY

hSrcRgn1的全部(忽略hSrcRgn2)

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

在您用完一个区域后,可以像删除其它GDI对象那样删除它:

  
  
DeleteObject (hRgn) ;
 
嗯,你和我一样,发现这个似乎没有什么用。。。其实,我发现矩形比裁减还要没有用,裁减的(书商告诉了我的)唯一用处就是:
可以设定可以被绘画的区域,通过将剪裁选入设备内容句柄,就可以限制画画的范围了。函数是这个样子的:
  
  
SelectObject (hdc, hRgn) ;
后面是一个例子,有时间就动动手吧~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值