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

转载 2011年01月12日 15:04:00

(1)Windows坐标系统

Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。

 

<1>逻辑坐标系(Logical Coordinate)是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。

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

 

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

屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,如GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。弹出式菜单使用的也是屏幕坐标。

 

 

窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。

客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

 

下面三种都是显示设备的物理坐标,它们在屏幕上用真实的物理像素表示

 

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

 

逻辑坐标是GDI函数在屏幕上显示数据所用的坐标,逻辑坐标除非与物理坐标相关联,否则没有义。windows依靠映射模式解释逻辑坐标。比如缺省的模式为MM_TEXT,该模式下,物理坐标与逻辑坐标是一对一的关系。

 

      逻辑坐标(Logical Coordinate)是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下: 

  1. 窗口为非滚动窗口 

  2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。

  在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻 

  坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC 函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。

 

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

编程时,有时需要根据当前的具体情况进行三种设备坐标之间或与逻辑坐标的相互转换。

MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。

MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。

 

(3)映射模式

映射模式确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向,所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角。此外,对于某些映射模式,用户还可以自定义窗口的长度和宽度,设置视图区的物理范围。

Windows定义了8种映射模式,见下表。

映射模式使得程序员可不必考虑输出设备的具体设备坐标系,而在一个统一的逻辑坐标系中进行图形的绘制。

映射方法(Mapping Mode)
逻辑单位
坐标轴方向

MM_TEXT(默认方式)
1 pixel
X轴正方向朝右,Y轴正方向朝下

MM_LOMETRIC
0.1 mm
X轴正方向朝右,Y轴正方向朝上

MM_HIMETRIC
0.01 mm
X轴正方向朝右,Y轴正方向朝上

MM_LOENGLISH
0.01 inch
X轴正方向朝右,Y轴正方向朝上

MM_HIENGLISH
0.001 inch
X轴正方向朝右,Y轴正方向朝上

MM_TWIPS
1/1440 inch
X轴正方向朝右,Y轴正方向朝上

MM_ISOTROPIC
自定义(X=Y)
自定义

MM_ANISOTROPIC
自定义(X!=Y)
自定义

当绘制的图形需要随着窗口的大小改变而自动改变的时候,一般选择MM_ISOTROPIC和MM_ANISOTROPIC映射方式。它们的唯一区别就是前者的X轴和Y轴的逻辑单位的大小是相同的,单词“isotropic”就是各个方向相等的意思,此映射方式适合绘制圆或正方形。而实际应用中,常常给X轴和Y轴取不同的比例,这时候选择MM_ANISOTROPIC映射方式。单词“anisotropic”就是各个方向相异的意思。

(4)自定义映射模式

“窗口”和“视口”的概念:

窗口(Window):对应逻辑坐标系上程序员设定的区域

视口(Viewport):对应实际输出设备上程序员设定的区域

窗口原点是指逻辑窗口坐标系的原点在视口(设备)坐标系中的位置,视口原点是指设备实际输出区域的原点。

除了映射模式,窗口和视口也是决定一个点的逻辑坐标如何转换为设备坐标的一个因素。一个点的逻辑坐标按照如下式子转换为设备坐标:

设备(视口)坐标 = 逻辑坐标 – 窗口原点坐标 + 视口原点坐标

//定义坐标映射方式

WINGDIAPI int   WINAPI SetMapMode(HDC, int);

此API函数在MFC中封装为CDC::virtual int SetMapMode(int nMapMode);

//定义逻辑窗口区域,单位为逻辑单位(Logical)

WINGDIAPI BOOL WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);

此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);

//设置逻辑窗口的原点坐标,缺省原点为(0,0)。

WINGDIAPI BOOL WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);

此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y);

注意:SetWindowOrg(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。

//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel)

WINGDIAPI BOOL WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);

此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int cy);

注意:SetViewportExt(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。

//设置视口的原点坐标,缺省原点为(0,0)。

WINGDIAPI BOOL WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);

此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);

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

(1)Windows坐标系统 Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采...
  • Andeewu
  • Andeewu
  • 2013年12月11日 15:58
  • 435

理解映射方式、设备坐标系、逻辑坐标系、设置逻辑坐标原点与设备坐标原点

在VC下进行GDI编程,理解映射方式、设备坐标系、逻辑坐标系、设置逻辑坐标原点和设备坐标原点,真的把我折磨的够厉害的,花了很多时间,终于弄明白一些了,在此记录下,以便以后温习。   一、关于映射...
  • s634772208
  • s634772208
  • 2014年10月03日 18:07
  • 1468

屏幕坐标系,世界坐标系

世界坐标系 这里只是介绍二维世界坐标系。如下图1。 (图1) 屏幕坐标系 屏幕坐标系,主要有两种, 第一种:以左上角为原点。代表的操作系统有Windows,Android,Symbi...
  • hherima
  • hherima
  • 2013年03月26日 10:08
  • 2269

【Modern OpenGL】坐标系统 Coordinate Systems

上面说的转换过程:坐标-->标准换坐标系-->屏幕坐标系的转换过程是一步一步完成的。其中,在最终将对象上的点转换到屏幕坐标系之前,我们需要将它们逐步转换到一些中间的坐标系。之所以要进行这样的转换,是因...
  • aganlengzi
  • aganlengzi
  • 2016年01月02日 15:16
  • 960

安卓自定义View基础-坐标系

由于移动设备一般定义屏幕左上角为坐标原点,向右为 x 轴增大方向,向下为 y 轴增大方向, 所以在手机屏幕上的坐标系与数学中常见的坐标系是稍微有点差别的。...
  • u013831257
  • u013831257
  • 2016年01月05日 17:39
  • 3375

导航坐标系和大地坐标系的转化程序

导航坐标系和大地坐标系的转化程序主要目的:实现了 站心坐标系和大地坐标系的转化(有什么用?为了实现由GPS坐标获得相对距离)什么是站心坐标系呢?以你为坐标原点,XYZ坐标系。什么是大地坐标系呢...
  • sinat_33829806
  • sinat_33829806
  • 2017年01月14日 23:01
  • 932

C#中屏幕坐标与客户区域相互转换

 获取屏幕坐标用Cursor.Position转换为当前空间中的坐标this.PointToClient(Cursor.Position)...
  • huhai463127310
  • huhai463127310
  • 2008年07月27日 08:16
  • 5085

android坐标系详解

1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自定义控件,但是大多数都是授之以鱼,却很少有较为系统性授之于渔的文章,同时由于自己也迟迟没有时间规划这一系列文...
  • NicolasYan
  • NicolasYan
  • 2016年03月21日 10:20
  • 2405

逻辑坐标与设备坐标——全窗口坐标、屏幕坐标、客户区坐标的总结

Windows应用程序绘制图形时使用的是一种逻辑单位,每个逻辑单位的大小由映射模式决定,这个逻辑单位既可以与设备单位(屏幕或打印机上的一个像素点)相同,也可以是一种物理单位(如毫米),还可以是用户自定...
  • lyh03601
  • lyh03601
  • 2014年03月26日 23:03
  • 2694

C#.net绘制坐标系方法。

 using System;using System.Drawing;using System.Windows.Forms;namespace WindowsFormsApplicationSine_...
  • naiht
  • naiht
  • 2009年11月11日 16:59
  • 739
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:逻辑坐标系 设备坐标系 客户坐标系 屏幕坐标系
举报原因:
原因补充:

(最多只允许输入30个字)