MOveWindow需要注意的GetWindowRect 和GetClientRect
GetClientRect 不等于 GetWindowRect 然后ScreenToClient。。。
GetClientRect() 得到的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏计算,仅仅是个大小,返回值的左上角永远为0,0)
GetWindowRect() 得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)
ScreenToClient() 就是把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标。
先GetWindowRect 获取屏幕下坐标,再ScreenToClient就可以获取当前相对于主窗口的坐标了。。。
ScreenToClient后的坐标的左上角不一定为0,0
m_st_hline2_.GetWindowRect(rtCtrl); rtCtrl.MoveToY(rtPos.bottom + SPACE); ScreenToClient(rtCtrl); m_st_hline2_.MoveWindow(rtCtrl);
void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
参数
x指定了CWnd的左边的新位置。
y指定了CWnd的顶部的新位置。
nWidth指定了CWnd的新宽度。
nHeight指定了CWnd的新高度。
MoveWindow()函数功能:改变指定窗口的位置和大小.对顶窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.对于Owned窗口,位置和大小取决于屏幕左上角。我们的做法是正确的。
但是我测试出来的结果,放置的对话框总是相对于屏幕左上角的,而不是其父对话框的位置。经过反复查找我才发现,需要将放置的对话框属性中 的Style的值改为 “Child” ,只有这要设置后,放置的对话框才会作为另一个对话框的子对话框。

浙公网安备 33010602011771号