把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;
其中 x、y分别是点的横坐标和纵坐标。
由于CPoint提供了一些重载运算符,使得CPoint的操作更加方便。如运算符“+”,“-”,“+=”和“-=”用于两个CPoint对象或一个CPoint对象与一个CSize对象的加减运算,运算符“==”和“!=”用于比较两个CPoint对象是否相等。
CSize类
类CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。
结构SIZE表示一个矩形的长度和宽度,其定义为:
typedefstruct tagSIZE{
LONGcx;
LONGcy;
}SIZE;
其中 cx、cy分别是长度和宽度。
与CPoint类似,CSize也提供了一些重载运算符。如运算符“+”,“-”,“+=”和“-=”,用于两个CSize对象或一个CSize对象与一个CPoint对象的加减运算,运算符“==”和“!=”用于比较两个CSize对象是否相等。
由于CPoint和CSize都包含两个整数类型的成员变量,他们可以进行相互操作。CPoint对象的操作可以以CSize对象为参数。同样,CSize对象的操作也可以以CPoint对象为参数。如可以用一个CPoint对象构造一个CSize对象,也可以用一个CSize对象构造一个CPoint对象,允许一个CPoint对象和一个CSize对象进行加减运算。
CRect类
类CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替。
结构RECT表示一个矩形的位置和尺寸,其定义为:
typedefstruct tagRECT{
LONGleft;
LONGtop;
LONGright;
LONGbottom;
}RECT;
其中 left、top分别表示矩形左上角顶点的横坐标和纵坐标,right、bottom分别表示矩形右下角顶点的横坐标和纵坐标。
由于CRect提供了一些成员函数和重载运算符,使得CRect的操作更加方便。
1.CRect的构造函数
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对象,参数l,t,r,b分别指定矩形的左边、上边、右边和底边。SrcRect是一个RECT结构的引用。LpSrcRect是一个指向RECT结构的指针。Point指定矩形的左上角顶点的坐标,size指定矩形的长度和宽度。topLeft指定矩形的左上角顶点的坐标,bottomRight指定矩形的右下角顶点的坐标。
2.CRect重载运算符
CRect重载的运算符包括:赋值运算符、比较运算符、算术运算符、交并运算符等。
赋值运算符“=”实现CRect对象间的拷贝。
比较运算符“==”和“!=”比较两个CRect对象是否相等(四个成员都相等时,两个对象才相等)。
算术运算符包括“+=”、“-=”、“+”、“-”,他们的第一个操作数是CRect对象,第二个操作数可以是POINT、SIZE或RECT。当第二个操作数是POINT或SIZE时,“+”和“+=”的运算结果使CRect矩形向x轴和y轴的正方向移动POINT或SIZE指定的大小。“-”和“-=”的运算结果则使CRect矩形向x轴和y轴的负方向移动POINT或SIZE指定的大小。当第二个操作数是RECT时,“+”和“+=”的运算结果使CRect矩形的左上角顶点向左上方向移动RECT前两个成员指定的大小,而CRect矩形的右下角顶点向右下方向移动RECT后两个成员指定的大小。“-”和“-=”的运算结果则使CRect矩形的左上角顶点向右下方向移动RECT前两个成员指定的大小,而CRect矩形的右下角顶点向左上方向移动RECT后两个成员指定的大小。
运算符“&”和“&=”得到两个矩形的交集(两个矩形的公共部分),运算符“|”和“|=”得到两个矩形并集(包含两个矩形的最小矩形)。
3.Crect其他常用成员函数
(1)Width():得到矩形的宽度;
(2)Height():得到矩形的高度;
(3)Size():得到矩形的大小(高度和宽度);
(4)TopLeft():得到矩形左上角顶点坐标;
(5)BottomRight():得到矩形右下角顶点坐标;
(6)PtInRect():判断一个点是否在矩形内,如是返回真,否则返回假。原形如下:
BOOL PtInRect( POINT point ) const;
(7)IsRectEmpty():判断矩形是否为空(高度和宽度都是0);
(8)IsRectNull():判断矩形是否为0(左上角和右下角坐标都是0);
(9)SetRect():设置矩形四个成员变量的值。
4.CRect的规格化
一个规格化的矩形是指他的高度和宽度都是正值,即矩形的右边大于矩形的左边,矩形的底边大于矩形的上边。矩形的规格化函数是NormalizeRect(),该函数比较矩形的的left和right及top和bottom,如果不满足规格化要求,则对换两个值。上面介绍的大部分运算符和成员函数,只有规格化的矩形才能得到正确结果。