函数说明

GetWindowRect
此函数是获取窗体或者控件在屏幕坐标系下的坐标。
若此函数用于窗体初始化函数中,原点位于窗体的左上角;
若此函数在窗体初始化完成之后使用,原点位于屏幕的左上角。
ScreenToClient
此函数是将屏幕坐标转化为客户区坐标。
GetClientRect
此函数是获取窗体或者控件客户区的大小,一般来说,针对窗体还是控件,其获取的Left、Top参数均为0;
ClientToScreen
此函数是将客户区坐标转化为屏幕坐标
MoveWindow
针对窗体,使用屏幕坐标,若窗体存在父窗体,则使用父窗体客户区坐标;
针对控件,使用窗体客户区坐标。

针对窗体进行测试

CRect rectClientRect;
GetClientRect(rectClientRect);         //top=0 botton=397 left=0 right=564CRect rectClientToScreen;
rectClientToScreen = rectClientRect;
ClientToScreen(rectClientToScreen);    //top=26 botton=423 left=3 right=567CRect rectWinRect;
GetWindowRect(rectWinRect);            //top=0 botton=426 left=0 right=570CRect rectScreenToClient;
rectScreenToClient = rectWinRect;
ScreenToClient(rectScreenToClient);    //top=-26 botton=400 left=-3 right=567int nTitltHeight = GetSystemMetrics(SM_CYCAPTION); //标题栏高度23MoveWindow(rectWinRect.left,rectWinRect.top,rectWinRect.Width(),rectWinRect.Height());//窗体不动


通过测试结果也可以证明,该对话框上下边框相等,均为3。
其中左右边框也为3。

在移动控件位置时注意事项

若针对控件使用GetWindowRect,则获取的是控件的客户区的大小。
若要获取控件位于客户区的坐标,则应该使用GetWindowRect,再使用ScreenToClient。

CRect rectButtonWinRect;
GetDlgItem(IDC_BUTTON1)->GetClientRect(rectButtonWinRect);//top=0 botton=67 left=0 right=161CRect rectButtonClientRect;
GetDlgItem(IDC_BUTTON1)->GetWindowRect(rectButtonClientRect);//top=49 botton=116 left=44 right=205
ScreenToClient(rectButtonClientRect);GetDlgItem(IDC_BUTTON1)->MoveWindow(rectButtonClientRect);//控件处于原位置不动

List Control控件测试

CRect rectListWinRect;
GetDlgItem(IDC_LIST1)->GetWindowRect(rectListWinRect); //top=159 botton=409 left=47 right=241
CRect rectListClientRect;
GetDlgItem(IDC_LIST1)->GetClientRect(rectListClientRect); //top=0 botton=246 left=0 right=190


其中

rectListWinRect.bottom-rectListWinRect.top != rectListClientRect.bottom - rectListClientRect.top;

这是由于List Control是具有边框的。
GetWindowRect获取的是整个控件相对于原点的位置;
GetClientRect获取的是控件客户区的位置。

弹窗测试1(GetWindowRect)

在Test窗体上点击Button1,弹出Dialog窗体。

在Dialog的初始化窗体中执行如下代码

CRect rectButtonWin;
GetDlgItem(IDC_BUTTON2)->GetWindowRect(rectButtonWin);//top=431 botton=493 left=740 right=887

很显然,得到的区域并不是以Dialog窗体左上角为坐标原点。
这是由于父窗体已经存在,此时的GetWindowRect是以屏幕左上角点为坐标原点。

弹窗测试2(MoveWindow)


点击“弹窗”按钮,弹出Dialog1对话框。

void CTestDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CDlg1* dlg1 = new CDlg1();dlg1->Create(IDD_DIALOG1,this);CRect rec1;dlg1->GetWindowRect(rec1);dlg1->MoveWindow(40,50,rec1.Width(),rec1.Height());dlg1->ShowWindow(SW_SHOW);
}
若对话框属性设置为Child,MoveWindow的坐标参数为Test窗体的客户区坐标。
若对话框属性设置为Pop, MoveWindow的坐标参数为屏幕坐标。

参考博客

GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结相关推荐

  1. GetClientRect()和GetWindowRect()

    GetClientRect()   是得到客户区坐标系下客户区的RECT GetWindowRect()是得到屏幕坐标系下整个窗口的RECT GetSystemMetrics()是获得屏幕分辨率大小 ...

  2. 窗口的位置:GetWindowRect与MoveWindow等

    父对话框的整个窗口区=父对话框客户区+父对话框标题栏区 1. GetWindowRect()获取的是以屏幕左上角为(0,0)点的窗口区域,是屏幕坐标系. ①  如果对父对话框调用GetWindowRe ...

  3. GetWindowRect() 和 GetClientRect() 的区别

    新建一个基于对话框的MFC的exe程序: 删除对话框的所有按钮,并添加一个test按钮,添加一个Static控件,ID为IDC_STATIC: 双击test按钮,在响应函数中添加以下代码: View ...

  4. 易语言-API 取窗口或者组件句柄的 屏幕坐标并限制区域 GetWindowRect ClipCursor getwindowrect GetClientRect WindowFromPoint

    .版本 2 .DLL命令 ClipCursor_, 整数型, "user32", "ClipCursor", , 将指针限制到指定区域.ClipCursorBy ...

  5. DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

    设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离 ...

  6. MoveWindow函数用法

    一.MoveWindow win32 API函数: BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRe ...

  7. pythonwin32api拖动图标_Python win32gui.MoveWindow方法代码示例

    # 需要导入模块: import win32gui [as 别名] # 或者: from win32gui import MoveWindow [as 别名] def _CreateChildWind ...

  8. Visual C++/MFC入门教程

    Visual C++/MFC入门教程 VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友 ...

  9. VC开发指南--Visual C++/MFC入门教程

    VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一 ...

  10. VC++ 坐标问题总结,控件大小随窗口变化

    [出处:blog.csdn.net/lanmanck] 一般变控件位置和大小在OnSize()消息中处理,不外乎几个函数: GetClientRect(),GetClientRect(),Screen ...

最新文章

  1. 第二章:Android系统与嵌入式开发读书笔记
  2. C语言typedef小结1(转载自百度百科)
  3. One Order CLOSING date修改后的执行原理
  4. 子类重写父类变量_为什么在子类中不重写超类的实例变量
  5. 找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!
  6. 通过实例讲解java接口和抽象类的特殊实现方法
  7. python字符串说法错误的是_【单选题】关于Python字符串的表示方法,下列说法错误的是: A. 字符串是字符的序列表示,只能由...
  8. asp.net 读取mysql_asp.net封装mysql工具类,在页面上引用读取的数据
  9. 绝缘吹风机行业调研报告 - 市场现状分析与发展前景预测
  10. 在sqlyog中创建MySQL触发器简单实例
  11. Ubuntu通过apt-get安装指定版本和查询软件源有多少个版本
  12. 计算机盘快捷键,电脑键盘快捷键全解
  13. ntfs格式硬盘如何读写mac苹果电脑
  14. 【Docker】03 Docker的常用命令
  15. 陈继儒 -- 《小窗幽记》
  16. ctf入门题库_「ctf比赛」web安全CTF比赛习题(初级) - seo实验室
  17. ezuikit-js萤石云
  18. 华为云天筹AI求解器再次登顶 性能遥遥领先第二名11%
  19. 常见排序算法总结(实现原理,稳定度,使用场景,时间复杂度)
  20. 战神快排分享查询网站收录量以及网站流量的最精准办法

热门文章

  1. python解决八数码问题_A*算法实践——八数码问题
  2. Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法
  3. 【解决问题】WindowsXXX端口已被占用:以 1080端口已被占用 为例
  4. linux wifi问题,Ubuntu下wifi问题解决
  5. c语言scanf用法详解
  6. 光纤通信原理实验箱QY-JXSY03
  7. 关于1931CIE——RGB色坐标图转换到XYZ色坐标关系
  8. linux终端ANSI转义字符
  9. 电工/模电/数电/电气控制/PLC可编程控制综合实验装置
  10. PDF怎样免费转换成word?无须借助软件,网页就能轻松实现。