我们知道,显示器只是一个显示根据,它以像素为单位,一个像素就是一个点。显示器的分辨率就代表了它的像素个数,比如我的电脑分辨率是: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相关推荐

  1. DPtoLP/LPtoDP 和 ScreenToClient/ClientToScreen

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

  2. vc 中对对话框的几种操作

    注:以下代码以一个名为CTest6Dlg的对话框类为例 ------------------------------------------------------------------------ ...

  3. Windows GDI和GDI+编程实例剖析(1)

    Windows GDI和GDI+编程实例剖析(1) 作者:宋宝华  e-mail:21cnbao@21cn.com 1.基本概念 GDI在Windows中定义为Graphics Device Inte ...

  4. 初识GDI、GDI+

    GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重 ...

  5. Windows 2D 绘图 (GDI, GDI+, Direct2D)

    Windows 2D 绘图 GDI GDI 函数 GDI+ GDI 和 GDI+ 的区别 GDI+ 新特性 Direct2D 视觉效果 demo GDI GDI 是 Graphics Device I ...

  6. GDIplus学习--业精于勤荒于嬉,行成于思毁于随

    一.初步认识: GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interf ...

  7. 在MFC中怎么样让控件的大小随着主窗体大小改变而改变

    转载:https://blog.csdn.net/business122/article/details/11611421 MFC控件随着窗口大小变化VC++ 刚接触MFC不久,对MFC的许多函数和功 ...

  8. 吕鑫MFC学习系列六

    这一章学习的相关知识框架: 一.根据主窗口类型,MFC软件工程可以分为以下几种架构模型: 1.SDI(Single Document Interface):单文档界面,一个主框架窗口下只能编辑一份文档 ...

  9. VC实现卡拉OK字幕叠加

    一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...

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

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

最新文章

  1. 什么??听说Python要凉!
  2. 系统变量与环境变量的关系
  3. 全国首套中小学生人工智能教材在沪亮相
  4. java指令重排序代码演示
  5. linux+nginx+mysql+php系统修改文件上传大小限制
  6. Java并发编程实战~StampedLock
  7. linux线程同步教程,多线程同步
  8. python---字符串
  9. oracle 常用调优方法
  10. Comet OJ - Contest #11 题解赛后总结
  11. idea如何将web项目打成war包maven和非maven
  12. java interface 传值_前后端分离传值方案-RestfulAPI
  13. 大数据shipin教程_尚硅谷大数据视频教程,粉丝众多,人手一套尚硅谷教程
  14. 【gp数据库】你可能不知道却超级实用的函数
  15. 空间梁单元C语言有限元编程,有人会有限元编程吗
  16. 大数据分析师岗位是青春饭
  17. 基于MATLAB GUI的指纹识别系统
  18. word文档找不到smartart_Word2007新工具“SmartArt”使用教程
  19. 程序员求职面试三部曲之一:选择合适的工作单位(转)
  20. 产业洞察:4成云计算企业落地北京,资本加持之下形成良好应用生态

热门文章

  1. VS Code插件离线安装教程
  2. 分形之——谢尔宾斯基三角形
  3. 替换字符串中全部斜杠
  4. 时间序列分析系列(一) : 基本概念
  5. 不会吧不会吧!不会还有人用破解版origin吧——免费使用OriginPro学习版方法
  6. 设置Visual Studio代码折叠
  7. Microsoft Lync2013客户端下载
  8. 数值分析的学科体系_清华大学 数值分析 视频教程
  9. 比较一下 淘宝、易趣、拍拍、百度有啊
  10. 《淘宝网开店 进货 运营 管理 客服 实战200招》——1.9 熟悉网上开店的流程...