现在的位置: 首页 > 综合 > 正文

GDI 坐标系 与 映射模式

2018年02月07日 ⁄ 综合 ⁄ 共 1999字 ⁄ 字号 评论关闭

GDI 坐标系

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

逻辑坐标系 与 设备坐标系:

  • 逻辑坐标系是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标。
  • 设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能表示的最小长度单位为单位,X轴方向向右,Y轴方向向下。设备坐标系的原点位置(0, 0)不限定在设备显示区域的左上角。

屏幕坐标系、窗口坐标系与客户区坐标系:

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

  • 屏幕坐标系以屏幕左上角为原点,一些与整个屏幕有关的函数均采用屏幕坐标,
    如:GetCursorPos()、SetCursorPos()、CreateWindow()、MoveWindow()。
    弹出式菜单使用的也是屏幕坐标。
  • 窗口坐标系以窗口左上角为坐标原点,它包括窗口标题栏、菜单栏和工具栏等范围。
  • 客户区坐标系以窗口客户区左上角为原点,主要用于客户区的绘图输出和窗口消息的处理。鼠标消息的坐标参数使用客户区坐标,CDC类绘图成员函数使用与客户区坐标对应的逻辑坐标。

坐标之间的相互转换:

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

  • MFC提供了两个函数CWnd::ScreenToClient()和CWnd::ClientToScreen()用于屏幕坐标与客户区坐标的相互转换。
  • MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互转换。

 

映射模式

  1. 映射模式确定了在绘制图形时所依据的坐标系,它定义了逻辑单位的实际大小、坐标增长方向。
    所有映射模式的坐标原点均在设备输出区域(如客户区或打印区)的左上角。
    此外,对于某些映射模式,用户还可以自定义窗口的长度和宽度,设置视图区的物理范围。
  2. Windows定义了8种映射模式:
    MM_TEXT、MM_LOMETRIC、MM_HIMETRIC、MM_LOE- NGLISH、MM_HIENGLISH、MM_TWIPS、MM _ISOTROPIC、MM_ANISOTROPIC
  3. 映射模式使得程序员可不必考虑输出设备的具体设备坐标系,而在一个统一的逻辑坐标系中进行图形的绘制。

Windows映像方式的设置方法:
在MFC应用程序中,通过调用CDC类的SetMapMode()函数来设置映像方式。
如:

       pDC->SetMapMode(n);

其中,n是在上表中列出的映像方式的识别码。该函数的原型为:
virtual int SetMapMode( int nMapMode );

 

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

窗口指的是虚拟存在的一个屏幕,而视口指的是在屏幕上看到的视图客户区域。

在Windows中绘制图形时,并不是把图形直接绘制到屏幕上,而是以各种映像方式下的逻辑坐标系将图形绘制到虚拟的窗口中,然后再将这个窗口中的内容映像到视口中。如果是映像到屏幕上就实现了图形的显示;如果是映像到打印机等输出设备上就实现了图形的打印输出。

因此,窗口原点、视口原点和坐标系中的原点3者的概念是不同的。窗口原点和视口原点指的是同一个点在窗口逻辑坐标和视口设备坐标系的坐标值,它决定了图形由窗口映射到视口时的相对位置。

窗口和视口有关的操作函数

在CWnd类中与窗口和视口有关的操作函数如下:

 

1. SetWindowOrg函数
SetWindowOrg函数用来设置一个与设备环境有关的窗口原点。
CPoint SetWindowOrg(int x,int y);
CPoint SetWindowOrg(POINT point);

 

2. SetViewportOrg函数
SetViewportOrg函数用来设置一个与设备环境有关的视口原点。
CPoint SetViewportOrg(int x,int y);
CPoint SetViewportOgr(POINT point);

 

3. SetWindowExt函数
SetWindowExt函数用来设置与设备环境有关的窗口在x和y方向的幅度。
只有在MM_ISOTROPIC映像方式下该函数才有效。
virtual CSize SetWindowExt(int cx,int cy);
virtual CSize SetWindowExt(SIZE size);

 

4. SetViewportExt函数
SetViewportExt函数用来设置与设备环境有关的视口在x和y方向的幅度。
只有在MM_ISOTROPIC映像方式下该函数才有效。
virtual CSize SetViewporExt(int cx,int cy);
virtual CSize SetViewporExt(SIZE size);

 

 

 

 

 

 

抱歉!评论已关闭.