GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结
函数说明
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用法总结相关推荐
- GetClientRect()和GetWindowRect()
GetClientRect() 是得到客户区坐标系下客户区的RECT GetWindowRect()是得到屏幕坐标系下整个窗口的RECT GetSystemMetrics()是获得屏幕分辨率大小 ...
- 窗口的位置:GetWindowRect与MoveWindow等
父对话框的整个窗口区=父对话框客户区+父对话框标题栏区 1. GetWindowRect()获取的是以屏幕左上角为(0,0)点的窗口区域,是屏幕坐标系. ① 如果对父对话框调用GetWindowRe ...
- GetWindowRect() 和 GetClientRect() 的区别
新建一个基于对话框的MFC的exe程序: 删除对话框的所有按钮,并添加一个test按钮,添加一个Static控件,ID为IDC_STATIC: 双击test按钮,在响应函数中添加以下代码: View ...
- 易语言-API 取窗口或者组件句柄的 屏幕坐标并限制区域 GetWindowRect ClipCursor getwindowrect GetClientRect WindowFromPoint
.版本 2 .DLL命令 ClipCursor_, 整数型, "user32", "ClipCursor", , 将指针限制到指定区域.ClipCursorBy ...
- DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen
设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离 ...
- MoveWindow函数用法
一.MoveWindow win32 API函数: BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRe ...
- pythonwin32api拖动图标_Python win32gui.MoveWindow方法代码示例
# 需要导入模块: import win32gui [as 别名] # 或者: from win32gui import MoveWindow [as 别名] def _CreateChildWind ...
- Visual C++/MFC入门教程
Visual C++/MFC入门教程 VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友 ...
- VC开发指南--Visual C++/MFC入门教程
VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一 ...
- VC++ 坐标问题总结,控件大小随窗口变化
[出处:blog.csdn.net/lanmanck] 一般变控件位置和大小在OnSize()消息中处理,不外乎几个函数: GetClientRect(),GetClientRect(),Screen ...
最新文章
- 第二章:Android系统与嵌入式开发读书笔记
- C语言typedef小结1(转载自百度百科)
- One Order CLOSING date修改后的执行原理
- 子类重写父类变量_为什么在子类中不重写超类的实例变量
- 找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!
- 通过实例讲解java接口和抽象类的特殊实现方法
- python字符串说法错误的是_【单选题】关于Python字符串的表示方法,下列说法错误的是:
A. 字符串是字符的序列表示,只能由...
- asp.net 读取mysql_asp.net封装mysql工具类,在页面上引用读取的数据
- 绝缘吹风机行业调研报告 - 市场现状分析与发展前景预测
- 在sqlyog中创建MySQL触发器简单实例
- Ubuntu通过apt-get安装指定版本和查询软件源有多少个版本
- 计算机盘快捷键,电脑键盘快捷键全解
- ntfs格式硬盘如何读写mac苹果电脑
- 【Docker】03 Docker的常用命令
- 陈继儒 -- 《小窗幽记》
- ctf入门题库_「ctf比赛」web安全CTF比赛习题(初级) - seo实验室
- ezuikit-js萤石云
- 华为云天筹AI求解器再次登顶 性能遥遥领先第二名11%
- 常见排序算法总结(实现原理,稳定度,使用场景,时间复杂度)
- 战神快排分享查询网站收录量以及网站流量的最精准办法
热门文章
- python解决八数码问题_A*算法实践——八数码问题
- Steam注册遇到CAPTCHA问题,一直注册不了,一个简单的注册办法
- 【解决问题】WindowsXXX端口已被占用:以 1080端口已被占用 为例
- linux wifi问题,Ubuntu下wifi问题解决
- c语言scanf用法详解
- 光纤通信原理实验箱QY-JXSY03
- 关于1931CIE——RGB色坐标图转换到XYZ色坐标关系
- linux终端ANSI转义字符
- 电工/模电/数电/电气控制/PLC可编程控制综合实验装置
- PDF怎样免费转换成word?无须借助软件,网页就能轻松实现。