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 @   曦花  阅读(518)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示