WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标

来源:互联网 发布:淘宝网道具道士服 编辑:程序博客网 时间:2024/05/09 20:06

(1)Windows坐标系统

Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,

GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。

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

<2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能表示的最小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点位置(0, 0)不限定在设备显示区域的左上角。

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

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

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

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

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

     屏幕坐标 Screen   coordinates:   原点(0,0)位于屏幕的左上角  
     窗口坐标 Window   coordinates:   原点(0,0)位于窗口的左上角(包括非客户区,如标题条)  
     客户区坐标 Client-window   coordinates:   原点(0,0)位于客户窗口的左上角   
  
     逻辑坐标是GDI函数在屏幕上显示数据所用的坐标,逻辑坐标除非与物理坐标相关联,否则没有义.windows依靠映射模式解释逻辑坐标.比如缺省的模式为MM_TEXT,该模式下,物理坐标与逻辑坐标是一对一的关系.

(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. 物理设备坐标,计算机最终赖以显示的,硬件驱动系统使用的坐标系统,其值以像素为单位
2. 物理设备坐标与设备坐标不是一回事.所有的坐标系都需要与物理设备坐标形成一种映射关系,设备坐标便是这映射中的一种WM_TEXT.但是,由于WM_TEXT映射是全等映射,
所以,设备坐标在外在体现上与物理设备坐标是一回事了.
3. 通常所说的屏幕坐标,便是指物理设备坐标
4. 视口,简单的理解,物理设备坐标系中的一个矩形区域;窗口,一个逻辑名词,比如,要在屏幕(20,20,50,50)上画一个长120米,宽80米的足球场,这里,(20,20,50,50)这个区域便是视口,
而(120,80)用来描述了窗口.换句话说,窗口和视口的关系,也就是各种坐标系统与物理设备坐标系统的映射关系.
5. 其实,这些映射关系可以随意定,不过,windows预定义了一些映射关系,也就是通常说的映射模式

原创粉丝点击