GetClientRect()和GetWindowRect()
GetClientRect() 是得到客户区坐标系下客户区的RECT
GetWindowRect()是得到屏幕坐标系下整个窗口的RECT
GetSystemMetrics()是获得屏幕分辨率大小
根据不同参数:
int width = GetSystemMetrics ( SM_CXSCREEN );
int height= GetSystemMetrics ( SM_CYSCREEN );
分别获得屏幕的宽和高。
int width = GetSystemMetrics ( SM_CXVIRTUALSCREEN );
int height= GetSystemMetrics ( SM_CXVIRTUALSCREEN);
分别获得虚拟屏的宽和高,如电脑接了双屏,就用这个来获取双屏的分辨率之和。
验证过程:
创建一个窗口,添加按钮,添加以下代码
CRect rc;
GetWindowRect(&rc);
MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());
点击按钮时,窗口不会变化。因为GetWindowRect是相对于屏幕的,MoveWindow后将窗口移动到了原来的位置,即位置没变。
CRect rc;
GetWindowRect(&rc);
MoveWindow(rc.left-, rc.top,rc.Width(), rc.Height());
点击按钮时,窗口向左移动
说明GetWindowRect获取的是屏幕坐标系下窗口的大小。
CRect rc;
GetClientRect(&rc);
MoveWindow(rc.left, rc.top, rc.Width(), rc.Height());
点击按钮时,窗口移动到屏幕左上角,因为GetClientRect获得的是客户区相对于客户区坐标系的位置,其left和top都为0,在未将客户区坐标转换为屏幕坐标(ClientToScreen)前MoveWindow会将窗口移动到屏幕的原点。且窗口变小,因为把窗口塞进了原客户区的RECT里了。
如果在中间加一个ClientToScreen过程,则窗口不会移动到屏幕左上角,但是窗口还是会变小。
CRect rc;
GetClientRect(&rc); int e = rc.left; //
int f = rc.top; //
int g = rc.Width(); //
int h = rc.Height();// ClientToScreen(&rc); int x = rc.left; //360
int y = rc.top; //296
int z = rc.Width(); //560
int u = rc.Height();//350 // 因为客户区大小要小于窗口大小,MoveWindow将窗口移动到客户区宽、客户区长的矩形内,所以窗口会变小
MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());
说明ClientToScreen只是改变参照坐标,唯一改变的是RECT的left和top的值。
但是先GetWindowRect后再ClientToScreen后,发现窗口RECT的left和top都加上了客户区的left和top,导致按下按钮后窗口往下移了一个客户区的高度,往右移了一个客户区的宽度。
CRect rc;
GetClientRect(&rc); int e = rc.left; //
int f = rc.top; //
int g = rc.Width(); //
int h = rc.Height();// GetWindowRect(&rc);
int i = rc.left; //
int j = rc.top; //
int k = rc.Width(); //
int m = rc.Height();// ClientToScreen(&rc); int x = rc.left; //717 = 360(客户区相对屏幕的left位置)+ 357(窗口相对屏幕的left位置)
int y = rc.top; //567 = 296(客户区相对屏幕的top 位置)+ 271(窗口相对屏幕的top 位置)
int z = rc.Width(); //
int u = rc.Height(); // MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());
即把一个窗口的RECT做ClientToScreen操作,窗口RECT的left会加上客户区的left,top会加上客户区的top,这是
为什么?
再试一下,把一个已经以屏幕坐标系为参照的RECT再做ClientToScreen操作,发现窗口的位置也会加上一个客户区的left和top
CRect rc;
GetClientRect(&rc);
int i = rc.left; //
int j = rc.top; //
int k = rc.Width(); //
int m = rc.Height();// ClientToScreen(&rc); int x = rc.left; //360
int y = rc.top; //296
int z = rc.Width();//560
int u = rc.Height();//350 ClientToScreen(&rc);
int n = rc.left; //720 = 2 * 360
int q = rc.top; //592 = 2 * 296
int w = rc.Width(); //560
int e = rc.Height();//350 MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());
所以在ClientToScreen(RECT)前需要确定参数RECT必须是以客户区为参照的RECT,如果是以屏幕为参照的RECT则会出问题。
ClientToScreen的功能是左边加上相对于Windows的Left值,顶部加上相对于Windows的Top值(待修改验证)
再来看看ScreenToClient()函数
CRect rc;
GetWindowRect(&rc);
int i = rc.left; //
int j = rc.top; //
int k = rc.Width(); //
int m = rc.Height();// ScreenToClient(&rc);
int n = rc.left; //-3 // 客户区原点和屏幕原点重合,窗口原点移动到了第二象限。
int q = rc.top; //-25
int w = rc.Width(); //566
int e = rc.Height();//378
// 窗口从屏幕参照变成了客户区参照,将客户区原点移动到了屏幕原点,窗口原点则变成负数。
MoveWindow(rc.left, rc.top,rc.Width(), rc.Height());
GetClientRect()和GetWindowRect()的更多相关文章
- VC杂记
获得Combobox的状态:向ComboBox发送CB_GETDROPPEDSTATE消息. 格式化字串:char buff[10] ; sprintf(buff,"1+1=%d" ...
- WTL版本ACEdit控件,改写自MFC版,附带源码
自动完成是个很酷也很实用的功能,比如在浏览器地址栏输入几个字母,相关的记录就会在下拉框中陈列出来. 最近在做公司产品UI部分的改善,原版本是MFC做的,我决定用WTL,于是就遇到自动完成控件的问题.遍 ...
- VC API常用函数简单例子大全(1-89)
第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...
- 【MFC】利用MFC写一个计时器小程序
1整体设计 创建对话框程序,并且设计对话框相关控件如图 相应的ID和对应的成员变量如图: 我的想法是这样的,只读属性的编辑框添加有CString类型的成员变量(如s_hour),在xxxDlg.h里另 ...
- GetWindowRect() GetClientRect() ScreenToClient() MoveWindow()
CWnd.GetWindowRect 参照坐标系:屏幕坐标系,原点为屏幕左上角(0,0)的位置 功能:取得调用窗口CWnd在屏幕坐标系下的RECT坐标 CWnd.GetClientRect 参照坐标系 ...
- GetWindowRect和GetClientRect的区别详解
一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClientRect这两个函数,是获取逻辑坐标系中窗口或控件(其实也是窗口)大小和坐标的常用函数了,有什么不一样的? ...
- GetWindowRect和GetClientRect的异同
由于项目需要,需要学习CGridCtrl控件的使用,测试控件时发现了一个问题,我无法将控件放在对话框的制定位置. 该问题的原因很容易发现,其实就是GetWindowRec()函数和GetClientR ...
- GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen
GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置. GetClientRect取得窗口客户区(不包括非客 ...
- GetWindowRect和GetClientRect的注意事项
发现GetClientRect()函数取值不正确,特此找来了些资料以供参考,具体如下,就可以明白怎么回事了. 一:关于坐标 MFC中绘图时经常涉及到坐标计算,GetWindowRect和GetClie ...
随机推荐
- Oracle字符串分割函数
今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...
- 解决APP中fragment重叠问题
由于内存重启,导致的frgament重叠,其原因就是FragmentState没有保存Fragment的显示状态,即mHidden,导致页面重启后,该值为默认的false,即show状态,所以导致了F ...
- CentOS 5上Apache配置虚拟主机范例
昨天实践了下在CentOS 5上通过Apache直接配置虚拟主机,服务器没有安装面板软件,所以只能通过SSH远程连接操作了.Apache安装在/etc/httpd目录下,这个即是Apache的根目录, ...
- jquery正则表达式显示文本框输入范围 只能输入数字、小数、汉字、英文字母的方法
正则表达式限制文本框只能输入数字 许多时候我们在制作表单时需要限制文本框输入内容的类型,下面我们用正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等各类代码.1.文本框只能输入数字代码(小数点 ...
- DataTables自定义筛选器
/* Custom filtering function which will search data in column four between two values */ $.fn.dataTa ...
- MySQL flush tables with read lock
mysql> flush tables with read lock; flush tables with read lock 会去关闭已经打开的所有文件,它要做这个操作就先要拿到锁:当发起这个 ...
- Oracle AWR
http://www.linuxidc.com/Linux/2011-10/44563.htm http://t.askmaclean.com/thread-3227-1-1.html http:// ...
- 这样就算会了PHP么?-9
PHP关于COOKIE的应用 <?php if (!isset($_COOKIE["visittime"])) { setcookie("visittime&quo ...
- LeetCode_Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- VS2010编译Qt程序失败------error LNK1123: 转换到 COFF 期间失败:
error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏使用VS2010编译VC++项目的时候可能会出这个问题. 据说升级到SP1后可能问题解决,但是下载量太大,目前没有得到证实. ...