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

来源:互联网 发布:用友软件西安分公司 编辑:程序博客网 时间:2024/04/28 10:52

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

一个矩形其实就是一个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) ;
后面是一个例子,有时间就动动手吧~~