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 ...
随机推荐
- windows启动、停止和重新启动Apache服务
启动.停止和重新启动Apache服务(1) 在Windows操作系统中,Apache一般以服务的方式运行.在安装Apache时,如果你选择了“for all users”,Apache就会自动安装为一 ...
- C语言初学 计算二元一次方程的问题
#include<stdio.h> #include<math.h> int main() { double a,b,c,disc,x1,x2; scanf("%lf ...
- 整型(int)转时间格式字符串及页面long型转时间格式字符串
1,如果是封装的整型的话需要在后台进行处理再返回页面 处理过程是这样的 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm ...
- iOS设备后台播放音乐方法
iOS设备后台播放音乐方法 1 在设置Capabliites中打开Background Modes,选择Audio And AirPlay 2 在控制viewDidLoad中添加下面代码 AVAudi ...
- 关于popupwindow的两种实现方式
http://104zz.iteye.com/blog/1685389 android PopupWindow实现从底部弹出或滑出选择菜单或窗口 本实例弹出窗口主要是继承PopupWindow类来实现 ...
- Codeforces 540D Bad Luck Island
http://codeforces.com/problemset/problem/540/D 题目大意: 会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人 ...
- Qt编程之实现属性窗口编辑器
类似于这种: 就是右下角这个框,有属性名字和对应的value编辑. 这个Widget是作为一个QDockWidget被添加到QMainWindow中的.QMainWindow必须要有centralWi ...
- AspNetPager实现真分页+多种样式
真假分页 分页是Web应用程序中最常用到的功能之一.当从数据库中获取的记录远远超过界面承载能力的时候,使用分页可以使我们的界面更加美观,更加的用户友好.分页包括两种类型:真分页和假分页. 其中假分页就 ...
- phpcms:一、安装及新建模板
1.复制D:\WWW\phpcms\phpcms\templates\目录下的default文件粘贴在当前目录下,并重命名为新模板名字(youpinzhiyuan2012) 2.打开D:\WWW\ph ...
- 今天弄了整整一天DCloud
开发一个新闻移动客户端 起先用appcan.apiCloud,最后选择了DCloud: MUI文档看了n久,js代码一上来不很适应编码风格,一堆括号弄得头大: 数据库由爬虫程序将新闻页面数据爬出来: ...