mfc中控件移动的问题

2024-11-17 18:26:38
推荐回答(1个)
回答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)这段代码获得的是按钮相对于整个父窗口的坐标,包括菜单和标题栏,而不是相对于父窗口客户区的坐标。若要获得相对于父窗口客户区的坐标则要做更多处理。