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” ,只有这要设置后,放置的对话框才会作为另一个对话框的子对话框。

 

posted @ 2020-08-07 17:46  曦花  阅读(563)  评论(0)    收藏  举报