本节内容介绍了有关矩形和对这个矩形的一系列操作。
一个矩形其实就是一个RECT的结构
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
这个结构就包含如下图所示的1,2点的x和y坐标:
一般情况下通过这个代码所示范的方式进行设定:
rect.top = xTop ;
rect.right = xRight ;
rect.bottom = xBottom ;
不过呢,这样很麻烦,下面一些函数有助于使用这个结构:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
---------------------------------------------------------------其他的函数------------------------------------------------------------------
将矩形沿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
);
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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
最简单的剪裁区域是矩形,有两种建立矩形的方法:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
或者
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) ;
后面是一个例子,有时间就动动手吧~~