ScreenToClient和ClientToScreen
我们知道,显示器只是一个显示根据,它以像素为单位,一个像素就是一个点。显示器的分辨率就代表了它的像素个数,比如我的电脑分辨率是:1024*768。如下图:
图1
就是说我的显示器有768行,1024列。其中每行1024个像素,每列768个像素。
显示屏幕有一个屏幕的坐标系,它的左上角坐标为原点(0,0),原点向下为正,向右为正,它的右下角坐标为为(1024,768),如下图:
图2
我们知道,坐标系是相对的,对于显示屏幕来说,以显示器的左上角为原点(0,0);而对于应用程序来说,它(应用程序)的的左上角为原点(0,0)。
从抽象的角度看,应用程序不过是一个矩形(长方形) (当然是对大多数应用程序而言,有些程序不是矩形),MFC有一个类CRect 就是描述一个矩形的。
它有6个构造函数,其中一个就是:
CRect rc(295,168,765,521);四个参数分表代表矩形的左边、上边、右边和底边。如下图:
图3
对于应用程序来说,它还有一个客户坐标系,它是以应用程序的客户区的左上角为坐标原点的,什么是客户区呢?如上图的应用程序:它的白色的部分就是客户区,非客户区就是应用程序外围的一些空间,包括标题栏,系统菜单区,最小化,最大化,关闭按钮等部分,以及一点点的边框。
图4
获取一个应用程序的客户区的大小的函数是:GetClientRect;
如:
CRect rc;//定义一个矩形保存客户区坐标
GetClientRect(&rc);//客户区坐标系
如上图,我们就是如此得到了客户区的矩形为(0,0,545,392),它的意思是此应用程序的客户区左上角坐标为(0,0),右下角坐标为:(545,392)。就是说客户区的长度为545像素,宽度为392像素。
还有一个函数是获取应用程序的屏幕坐标系的坐标(以屏幕左上角为原点):
CRect rc;
GetWindowRect(&rc); 得到的坐标为(274,175,750,560);注意,它的坐标是以整个应用程序的左上角来看的(而不是客户区的左上角)。它的大小就是整个应用程序窗口的大小。
图5
函数ClientToScreen用于将客户区坐标转化为屏幕坐标。
ClientToScreen(myRect);//转换为屏幕坐标 把对话框的大小变成客户区的大小
MoveWindow(myRect.left, myRect.top, myRect.Width(), myRect.Height());
当我们转化后,并movewindow到转换后的坐标系后,发现 左右底 每次减少了3个像素,说明应用程序的 左右底 的边框(非客户区)大小均为3个像素。如下图,
而 “上”每次减少了29个像素,说明标题栏上面的宽度为29个像素。
图6
图7
有些函数必须要使用屏幕坐标系,所以必须用函数ClientToScreen进行转换。
函数ScreenToClient相反,是把屏幕坐标系转换为客户区坐标系。
图8
图9
如上2图:应用程序的客户区宽度为470,高度为353。非客户区左边,右边和下面的边框均为3,就是绿色部分。上面的边框(标题系统菜单区宽度)为29.
所以整个应用程序的宽度为470+3+3 = 476,高度为353+29+3 = 385.
应用程序的客户坐标系坐标为(0,0,470,353). (宽470,高353)
应用程序的屏幕坐标系坐标为(274,175,750,560). 其中274代表应用程序左上角到屏幕左边的距离,175代表应用程序左上角到屏幕顶端的距离,750代表应用程序左下角到屏幕左边的距离,560代表应用程序左下角到屏幕顶端的距离。
750 = 应用程序左上角到屏幕左边的距离274+应用程序的宽度476;
560 = 应用程序左上角到屏幕顶端的距离175+应用程序的高度385;
如上图8所示。
执行ClientToScreen后,就是要得到客户区矩形的屏幕坐标系。
就是在应用程序屏幕坐标系的基础上,减去非客户区的宽度而已。
见图8,
左= 274+边框3=277,
上= 175+标题栏宽度29=204,
右= 750-边框3 = 747
底=560-边框3 = 557.
随意拖动程序的位置,发现均是+-边框的宽度而已。
CRect myRect;
GetWindowRect(&myRect); //274,175,750,560
ScreenToClient(myRect); //-3 ,-29,473,356
为什么是-3 ,-29,473,356呢,应该求的是整个应用程序矩形相对于客户区的坐标,
客户区的坐标是(0,0,470,353). (宽470,高353)
如图8,整个应用程序矩形的左上角相对客户区坐标就是(0-3,0-29)(减去边框的宽度),
因为向左向上为负,向下向右为正。而整个应用程序矩形的左下角相对客户区坐标就是(470+3,353+3),即加上边框宽度。见图8
无论怎样拖动窗体,客户区的坐标和.ScreenToClient后的坐标都是不变的,应该客户区的大小没有改变。而屏幕坐标是变化的。
ScreenToClient和ClientToScreen相关推荐
- DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen
设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标.通常将屏幕上的设备坐标称为屏幕坐标.设备坐标用对象距离窗口左上角的水平距离 ...
- vc 中对对话框的几种操作
注:以下代码以一个名为CTest6Dlg的对话框类为例 ------------------------------------------------------------------------ ...
- Windows GDI和GDI+编程实例剖析(1)
Windows GDI和GDI+编程实例剖析(1) 作者:宋宝华 e-mail:21cnbao@21cn.com 1.基本概念 GDI在Windows中定义为Graphics Device Inte ...
- 初识GDI、GDI+
GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重 ...
- Windows 2D 绘图 (GDI, GDI+, Direct2D)
Windows 2D 绘图 GDI GDI 函数 GDI+ GDI 和 GDI+ 的区别 GDI+ 新特性 Direct2D 视觉效果 demo GDI GDI 是 Graphics Device I ...
- GDIplus学习--业精于勤荒于嬉,行成于思毁于随
一.初步认识: GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interf ...
- 在MFC中怎么样让控件的大小随着主窗体大小改变而改变
转载:https://blog.csdn.net/business122/article/details/11611421 MFC控件随着窗口大小变化VC++ 刚接触MFC不久,对MFC的许多函数和功 ...
- 吕鑫MFC学习系列六
这一章学习的相关知识框架: 一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档 ...
- VC实现卡拉OK字幕叠加
一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...
- Visual C++/MFC入门教程
Visual C++/MFC入门教程 VC开发指南 1.1 如何学好VC 这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果.万事开头难,为了帮助朋友 ...
最新文章
- 什么??听说Python要凉!
- 系统变量与环境变量的关系
- 全国首套中小学生人工智能教材在沪亮相
- java指令重排序代码演示
- linux+nginx+mysql+php系统修改文件上传大小限制
- Java并发编程实战~StampedLock
- linux线程同步教程,多线程同步
- python---字符串
- oracle 常用调优方法
- Comet OJ - Contest #11 题解赛后总结
- idea如何将web项目打成war包maven和非maven
- java interface 传值_前后端分离传值方案-RestfulAPI
- 大数据shipin教程_尚硅谷大数据视频教程,粉丝众多,人手一套尚硅谷教程
- 【gp数据库】你可能不知道却超级实用的函数
- 空间梁单元C语言有限元编程,有人会有限元编程吗
- 大数据分析师岗位是青春饭
- 基于MATLAB GUI的指纹识别系统
- word文档找不到smartart_Word2007新工具“SmartArt”使用教程
- 程序员求职面试三部曲之一:选择合适的工作单位(转)
- 产业洞察:4成云计算企业落地北京,资本加持之下形成良好应用生态