mfc中控件移动的问题
我想让控件在两个固定的位置来回移动,但是使用getclientrect函数时获得的左上角坐标总是(0,0),如何获得控件相对于窗口的坐标呢?...
我想让控件在两个固定的位置来回移动,但是使用getclientrect函数时获得的左上角坐标总是(0,0),如何获得控件相对于窗口的坐标呢?
展开
1个回答
展开全部
没有现成的成员函数可以完成这个功能,可以用下面迂回的办法:(假设要获得一个CButton but控件的位置)
RECT rectBut;
but.GetWindowRect( &rectBut); //获取按钮控件的屏幕坐标
RECT rectParent;
(but.GetParent())->GetWindowRect( &rectParent ); //获取按钮父窗口的屏幕坐标
RECT rect; //开始计算按钮相对于父窗口的坐标
rect.left = rectBut.left - rectParent.left;
rect.right = rectBut.right - rectParent.left;
rect.top = rectBut.top - rectParent.top;
rect.bottom = rectBut.bottom - rectParent.top;
经过这段代码后,rect里面就是按钮空间相对于其所在窗口的坐标。这段代码有两点要特别注意:
1)but.GetParent()可能返回NULL,这在按钮是桌面上的按钮时发生,此时(but.GetParent())->GetWindowRect( &rectParent )将导致访问违例异常,程序会崩溃,但鉴于一般程序不会在桌面窗口上添加控件,因此不必作额外的检测。
2)这段代码获得的是按钮相对于整个父窗口的坐标,包括菜单和标题栏,而不是相对于父窗口客户区的坐标。若要获得相对于父窗口客户区的坐标则要做更多处理。
RECT rectBut;
but.GetWindowRect( &rectBut); //获取按钮控件的屏幕坐标
RECT rectParent;
(but.GetParent())->GetWindowRect( &rectParent ); //获取按钮父窗口的屏幕坐标
RECT rect; //开始计算按钮相对于父窗口的坐标
rect.left = rectBut.left - rectParent.left;
rect.right = rectBut.right - rectParent.left;
rect.top = rectBut.top - rectParent.top;
rect.bottom = rectBut.bottom - rectParent.top;
经过这段代码后,rect里面就是按钮空间相对于其所在窗口的坐标。这段代码有两点要特别注意:
1)but.GetParent()可能返回NULL,这在按钮是桌面上的按钮时发生,此时(but.GetParent())->GetWindowRect( &rectParent )将导致访问违例异常,程序会崩溃,但鉴于一般程序不会在桌面窗口上添加控件,因此不必作额外的检测。
2)这段代码获得的是按钮相对于整个父窗口的坐标,包括菜单和标题栏,而不是相对于父窗口客户区的坐标。若要获得相对于父窗口客户区的坐标则要做更多处理。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询