CRect 详解及注意事项

来源:互联网 发布:单片机最小系统的作用 编辑:程序博客网 时间:2024/04/30 03:40

把MoveWindow(x,y,width, height)和 MoveWindow(CRect(left, top , right, bottom)); 搞混了,以下是网友解读

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


MoveWindow(CRect(x,y,width, height); 
这个movewindow中的CRect标注的width, height 参数应该是指它的长度和宽度吧? 

看到这里我想楼主应该是理解错了,MSDN里看 CRect 所有的构造函数,你就应该清楚了

CRect( 
   int l, 
   int t, 
   int r, 
   int b  
) throw( );

CRect( 
   const RECT& srcRect  
) throw( );
CRect( 
   LPCRECT lpSrcRect  
) throw( );
CRect( 
   POINT point, 
   SIZE size  
) throw( );

CRect( 
   POINT topLeft, 
   POINT bottomRight  
) throw( );

按你那种写法,你用的是第一个构造函数,你虽然写的是 width 和 height 但是CRect的构造可不是这样认为的

r

    Specifies the right position of CRect. (右面的值,不是宽度)
b

    Specifies the bottom of CRect. (下面的值,不是高度)

如果你怕混淆,你完全可以用我标红的第二个构造,例如我的程序就这样用

// 确定下拉列表位置
CRect rectCombox = CRect(CPoint(615, 38), CSize(m_nClientWidth-620, 120));
GetDlgItem(IDC_ADDRESS)->MoveWindow(rectCombox);


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

再度解读 CPoint,类, CSize类, CRect类, 重点解读CRect类-----------------------------------------------------------------------------------------------------------------------------------------------

CPoint

CPoint是对Windows结构POINT的封装,凡是能用POINT结构的地方都可以用CPoint代替。

结构POINT表示屏幕上的一个二维点,其定义为:

typedef struct tagPOINT{

       LONGx;

       LONGy;

} POINT;

其中 xy分别是点的横坐标和纵坐标。

由于CPoint提供了一些重载运算符,使得CPoint的操作更加方便。如运算符“+”“-”“+=”“-=”用于两个CPoint对象或一个CPoint对象与一个CSize对象的加减运算,运算符“==”=”用于比较两个CPoint对象是否相等。

CSize

CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。

结构SIZE表示一个矩形的长度和宽度,其定义为:

       typedefstruct tagSIZE{

              LONGcx;

              LONGcy;

       }SIZE;

其中 cxcy分别是长度和宽度。

CPoint类似,CSize也提供了一些重载运算符。如运算符“+”“-”“+=”“-=”,用于两个CSize对象或一个CSize对象与一个CPoint对象的加减运算,运算符“==”=”用于比较两个CSize对象是否相等。

由于CPointCSize都包含两个整数类型的成员变量,他们可以进行相互操作。CPoint对象的操作可以以CSize对象为参数。同样,CSize对象的操作也可以以CPoint对象为参数。如可以用一个CPoint对象构造一个CSize对象,也可以用一个CSize对象构造一个CPoint对象,允许一个CPoint对象和一个CSize对象进行加减运算。

CRect

CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替。

结构RECT表示一个矩形的位置和尺寸,其定义为:

       typedefstruct tagRECT{

              LONGleft;

              LONGtop;

              LONGright;

              LONGbottom;

       }RECT;

其中 lefttop分别表示矩形左上角顶点的横坐标和纵坐标,rightbottom分别表示矩形右下角顶点的横坐标和纵坐标。

由于CRect提供了一些成员函数和重载运算符,使得CRect的操作更加方便。

1CRect的构造函数

CRect有如下6个构造函数:

CRect;

CRect int l, intt, int r, int b;

CRect constRECT& srcRect;

CRect LPCRECTlpSrcRect;

CRect POINTpoint, SIZE size;

CRect POINTtopLeft, POINT bottomRight;

说明:分别以不同的方式构造CRect对象,参数ltrb分别指定矩形的左边、上边、右边和底边。SrcRect是一个RECT结构的引用。LpSrcRect是一个指向RECT结构的指针。Point指定矩形的左上角顶点的坐标,size指定矩形的长度和宽度。topLeft指定矩形的左上角顶点的坐标,bottomRight指定矩形的右下角顶点的坐标。

2CRect重载运算符

CRect重载的运算符包括:赋值运算符、比较运算符、算术运算符、交并运算符等。

赋值运算符“=”实现CRect对象间的拷贝。

比较运算符“==”“!=”比较两个CRect对象是否相等(四个成员都相等时,两个对象才相等)。

算术运算符包括“+=”“-=”“+”“-”,他们的第一个操作数是CRect对象,第二个操作数可以是POINTSIZERECT。当第二个操作数是POINTSIZE时,“+”“+=”的运算结果使CRect矩形向x轴和y轴的正方向移动POINTSIZE指定的大小。“-”“-=”的运算结果则使CRect矩形向x轴和y轴的负方向移动POINTSIZE指定的大小。当第二个操作数是RECT时,“+”“+=”的运算结果使CRect矩形的左上角顶点向左上方向移动RECT前两个成员指定的大小,而CRect矩形的右下角顶点向右下方向移动RECT后两个成员指定的大小。“-”“-=”的运算结果则使CRect矩形的左上角顶点向右下方向移动RECT前两个成员指定的大小,而CRect矩形的右下角顶点向左上方向移动RECT后两个成员指定的大小。

运算符“&”“&=”得到两个矩形的交集(两个矩形的公共部分),运算符“|”“|=”得到两个矩形并集(包含两个矩形的最小矩形)。

3Crect其他常用成员函数

1Width:得到矩形的宽度;

2Height):得到矩形的高度;

3Size):得到矩形的大小(高度和宽度);

4TopLeft):得到矩形左上角顶点坐标;

5BottomRight:得到矩形右下角顶点坐标;

6PtInRect):判断一个点是否在矩形内,如是返回真,否则返回假。原形如下:

BOOL PtInRect POINTpoint const;

7IsRectEmpty):判断矩形是否为空(高度和宽度都是0);

8IsRectNull):判断矩形是否为0(左上角和右下角坐标都是0);

9SetRect):设置矩形四个成员变量的值。

4CRect的规格化

一个规格化的矩形是指他的高度和宽度都是正值,即矩形的右边大于矩形的左边,矩形的底边大于矩形的上边。矩形的规格化函数是NormalizeRect(),该函数比较矩形的的leftrighttopbottom,如果不满足规格化要求,则对换两个值。上面介绍的大部分运算符和成员函数,只有规格化的矩形才能得到正确结果。



原创粉丝点击