逻辑坐标系 设备坐标系 客户坐标系 荧屏坐标系

近年在学Win32的编制程序,看的是《Windows程序设计第4版》一书,那本书是山东人翻译的,有些译法和陆地不雷同,书中还有一些荒谬的地点,很多时候须求中国和英国文对照阅读,下载请点击

Windows应用程序绘制图形时利用的是一种逻辑单位,每一种逻辑单位的轻重缓急由映射情势决定,
那一个逻辑单位既能够与设备单位(显示屏或打字与印刷机上的3个像素点)相同,也得以是一种物理单
位(如分米),还能是用户自定义的一种单位。在Windows应用程序中,只要与输出有涉嫌,都
要使用映射情势。本文的目标是赞助读者了然映射情势的一些基本知识,并对在使用中平时出现的部分题材提议消除方案。

(1)Windows坐标类别
Windows坐标系分为逻辑坐标系和装置坐标系三种,GDI援救那二种坐标系。一般而言,
GDI的文本和图纸输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标地方是选择配备坐标。
<1>逻辑坐标系是面向DC的坐标系,那种坐标不考虑具体的设施项目,在绘图时,Windows会依据近年来设置的投射情势将逻辑坐标转换为设备坐标。
<2>设备坐标系是面向物理设备的坐标系,那种坐标以像素或设施所能表示的纤维长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点地方(0,
0)不限制在装置展现区域的左上角。

(1)Windows坐标种类

壹 、映射格局基本知识
当Windows应用程序在其客户区绘制图形时,必须付出在客户区的职位,其职分用x和y
多个坐标表示,x表示横坐标,y表示纵坐标。在全体的GDI绘制函数中,这么些坐标使用的是一
种”逻辑单位”。当GDI函数将出口送到有些物理设备上时,Windows将逻辑坐标
转换来设备坐标(如显示器或打字与印刷机的像素点)。逻辑坐标和配备坐标的转移是由映射格局决
定的。映射格局被储存在设备条件中。GetMapMode函数用于从设备条件获得当前的投射情势,SetMapMode函数用于安装设备条件的投射情势。
1.逻辑坐标

 

Windows坐标系分为逻辑坐标系和设备坐标系三种,GDI帮助那三种坐标系。一般而言,GDI的公文和图纸输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标地方是采取配备坐标。

好了,下边起始正文:

逻辑坐标是单身于设备的,它与设备点的大小非亲非故。使用逻辑单位,是落实”所见即所得”的底蕴。当程序员在调用一个画线的GDI函数LineTo,画出25.4mm(1英寸)
长的线时,他并不供给考虑输出的是何种设备。若设备是VGA荧屏,Windows自动将其转化为玖拾捌个像素点;若设备是七个300dpi的激光打字与印刷机,Windows自动将其转化为300个像素点。

设备坐标系分为显示屏坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。
1.荧屏坐标系以显示器左上角为原点,一些与成套显示屏有关的函数均使用显示屏坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是显示屏坐标。
2.窗口坐标系以窗口左上角为坐标原点,它包含窗口标题栏、菜单栏和工具栏等范围。
3.客户区坐标系以窗口客户区左上角为原点,主要用以客户区的绘图输出和窗口新闻的拍卖。鼠标音讯的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

<1>逻辑坐标系(Logical
Coordinate)是面向DC的坐标系,那种坐标不考虑现实的设备项目,在绘图时,Windows会依据当下设置的炫耀方式将逻辑坐标转换为设备坐标。

在看到GDI(GDI Graphic Device
Interface图形设备接口)
照耀格局这一节的时候,书中又是逻辑坐标,又是设备坐标,又是视口,窗口,又是视埠什么的,搞得人头都大了。即便本身未来还一贯不完全读懂,不过自个儿感到我曾经吸引了知情那一个东西的主线,下面包车型大巴事物就作为自身的笔记吧:

2.配备坐标

 

<2> 设备坐标(Device Coordinate)又叫做物理坐标(Physical
Coordinate),是指输出设备上的坐标。平时将显示屏上的设施坐标称为显示屏坐标。设备坐标用对象距离窗口左上角的水准距离和垂直距离来内定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角,不限定在设备显示区域的左上角。

1.逻辑坐标和设施坐标

Windows将GDI函数中钦命的逻辑坐标映射为装备坐标,在具备的装备坐标种类中,单位以像素点为准,水平值从左到右增大,垂直值从上到下增大。

(2)坐标之间的竞相转换
 编制程序时,有时须求基于当下的具体情形进行二种配备坐标之间或与逻辑坐标的相互转换。
1.MFC提供了八个函数CDC::DPtoLP()和CDC::
LPtoDP()用于装备坐标与逻辑坐标之间的交互转换。
2.MFC提供了八个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于显示屏坐标与客户区坐标的相互转换。

设施坐标系分为显示屏坐标系、窗口坐标系和客户区坐标系三种相互独立的坐标系。

 
 首先,逻辑坐标这些名词就让很三个人望而生畏,确实,无法“一面之识”地理解的翻译就不是好翻译 
 ——周树人。哈哈,开个玩笑,大家要清楚那五个东西,首先要想到假若你要用Win32要绘制一个事物,该怎么办啊?比如绘制二个矩形,若是大家调用的是Rectangle(hdc,30,20,50,80),(这几个函数的用法是Rectangle(hdc,left,top,right,bottom),作者叫雷锋同志,不用谢作者)。能够见见,跟很多GDI函数一样,这么些函数里面使用了成千成万数字,坐标。让大家回顾一下小学校文化,绘制一个东西,不仅应当搞理解她的尺寸,还应该搞明白他的单位,那么那里的30,20,50,80的单位是怎么样吧?很三人会说,是像素!这么些答案是对的,可是又不全对。事实上,Windows私下认可的映射格局(Mapping
Mode,简称便是MM)是MM_TEXT,在MM_TEXT映射形式(TEXT实际上跟文字没有多大关系,是那种映射情势下的坐标方向,从左到右,从上到下,跟文字阅读格局一样)下,这一个单位确实是像素。实际上,逻辑坐标和设施坐标的分别就在于他们的单位分歧!

Windows中归纳以下3种配备坐标,以满意各样不一致需求:

 

  • 显示屏坐标系以显示器左上角为原点,一些与总体荧屏有关的函数均选拔显示器坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是显示屏坐标。
  • 窗口坐标系以窗口左上角为坐标原点,它包蕴窗口标题栏、菜单栏和工具栏等限定。
  • 客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口新闻的处理。鼠标音讯的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

上边大家拿出3个公式

(1)客户区域坐标,包涵应用程序的客户区域,客户区域的左上角为(0,0)。

GetWindowRect()
获得的是在荧屏坐标系下的RECT(即以荧屏左上角为原点)
GetClientRect()
获得的是在客户区坐标系下的RECT(即以所在窗口左上角为原点,去掉了标题栏总结,仅仅是个轻重缓急,再次回到值的左上角永远为0,0) 
  
CRect rect;

下边两种都是展现设备的情理坐标,它们在荧屏上用真实的情理像素表示

         
 图片 1

(2)荧屏坐标,包涵全体显示器,显示器的左上角为(0,0)。显示屏坐标用在WM_MOVE新闻中(对于非子窗口)以及上边包车型地铁Windows函数中:CreateWindow和MoveWindow(都对此非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint和SetBrushOrg中。用函数ClientToScreen和ScreenToClient能够将客户区域坐标转换来荧屏区域坐标,或反之。

GetWindowRect(&rect);

  • 显示器坐标 Screen   coordinates:   原点(0,0)位于显示器的左上角  
  • 窗口坐标 Window   coordinates:  
    原点(0,0)位于窗口的左上角(包罗非客户区,如标题条)  
  • 客户区坐标 Client-window   coordinates:  
    原点(0,0)位于客户窗口的左上角

要讲上面的公式,就要先说一下视口(Viewport 湖南译作视埠)和窗口(Window
浙江译作视窗)

(3)全窗口坐标,包蕴一个顺序的万事窗口,包蕴题目条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC获得的窗口设备条件,可以将逻辑单位转换到窗口坐标。

ScreentoClient(&rect);

  逻辑坐标是GDI函数在荧屏上显得数据所用的坐标,逻辑坐标除非与物理坐标相关联,不然没有义。windows依靠映射形式解释逻辑坐标。比如缺省的形式为MM_TEXT,该形式下,物理坐标与逻辑坐标是一定的涉及。

首先,不要被那多个名字迷惑了,那多个坐标是跟映射有关的,跟显示器坐标系,窗口坐标系,客户端坐标系是相对独立的八个文化。

3.逻辑坐标与设施坐标的转换格局

差别

      逻辑坐标(Logical
Coordinate)是系统作为记录的坐标。在缺省的格局(MM_TEXT)下,逻辑坐标的动向和单位与设备坐标的方向和单位一律,也是以像素为单位来
表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和配备坐标即便在缺省格局下其数值也不见得相同,除了在偏下三种状态下:
  1. 窗口为非滚动窗口
  2.
窗口为滚动窗口,但垂直滚动条位于滚动边框的最顶端,水平滚动条位于最左端,但假如运动了滚动条那两种坐标就分歧了。
  在VC中鼠标坐标的坐标位置用设施坐标表示,但持有GDI绘图都用逻
坐标表示,所以用鼠标绘图时,那么必须将装备坐标转换为逻辑坐标,可以选拔CDC
函数DptoLP()将配备坐标转化为逻辑坐标,同样能够用LptoDP()将逻辑坐标转化为装备坐标。

实际公式拿出来,学数学的小伙伴是还是不是就懂了大半了,这么些公式格外重庆大学,掌握了那个公式,后边的无数东西就能知道,首先,公式中的Window,WinOrg,WinExt,正是带了Win的东西,正是应用的逻辑坐标的值,就跟GDI函数中的一样,逻辑坐标的单位可能是像素(MM_TEXT映射)、毫米(单位是0.1mm,在MM_LOMETWranglerIC映射下)等等等等(看下图).

炫耀情势定义了Windows怎样将GDI函数中钦赐的逻辑坐标映射为装备坐标。要一而再研商映射格局我们要介绍Windows有关映射情势的一些术语:我们将逻辑坐标所在的坐标系称为”窗口”,将设备坐标所在的坐标系称为”视口”。

CRect rect;

(2)坐标之间的交互转换

发表评论

电子邮件地址不会被公开。 必填项已用*标注