参考文献:
作者: 刘涛 http://tech.sina.com.cn/s/2005-06-20/1143640450.shtml
一、基础知识
(一)逻辑坐标。逻辑坐标与设备无关,缺省地,一个逻辑单位等于设备中的一个象素。它是实现“所见即所得”的基础。例如,当程序员调用LineTo函数绘制25.4mm(1 英 寸) 长的直线时,他只要使用合适的映射模式,那么就并不需要考虑输出的是何种设备。若设备是VGA显示器,Windows自动将其转化为96个像素点;若设备是一个300dpi的激光打印机,Windows自动将其转化为300 个像素点。
(二)设备坐标。图形输出时,Windows将GDI函数中指定的逻辑坐标映射为设备坐标,在所有的设备坐标系统中,单位以像素点为准,水平值从左到右增大(正方向向右),垂直值从上到下增大(正方向向下)。Windows中包括以下3 种设备坐标,以满足各种不同需要:
1、客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0, 0)。
2、屏幕坐标,包括整个屏幕,屏幕的左上角为(0, 0)。屏幕坐标用在WM_MOVE消息中(对于非子窗口)以及下面的Windows 函数中:CreateWindow 和MoveWindow(都对于非子窗口)、GetMessage、GetCursorPos、GetWindowRect、WindowFromPoint 和SetBrushOrg 中。 用函数ClientToScreen 和ScreenToClient可以将客户区域坐标转换成屏幕区域坐标,或反之。
3、全窗口坐标,包括一个程序的整个窗口,包括标题条、菜单、滚动条和窗口框,窗口的左上角为(0,0)。使用GetWindowDC得到的窗口设备环境,可以将逻辑单位转换成窗口”坐标。
(三)映射。映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。在下文中我们将介绍常用的映射方式。
习惯上,我们将逻辑坐标所在的坐标系称为“窗口”;将设备坐标所在的坐标系称为“视口”。“窗口”依赖于逻辑坐标,可以是像素点、毫米或其他尺度。
知识点:
1、GDI函数,图像操作,画图等等几乎都是在逻辑坐标下进行。极个别有几个不是,比如GetDeviceCaps,是GDI函数,但用的设备坐标。由window完成从逻辑坐标转换为设备坐标的工作。
2、几乎所有的非GDI函数,都使用的设备坐标。另外,MFC接收到的消息,鼠标移动WM_MOUSEMOVE,鼠标点击WM_LBUTTONDOWN,还有窗口重绘WM_SIZE等等,都用的设备坐标。所以点击鼠标得到的点位置,一般需要使用DpToLp函数将其转换为逻辑坐标以后再使用。
3、不管对窗口和视口原点作什么改变,设备原点(0,0)始终是客户区的左上角。
4、设备原点(0,0)与视口原点(ViewPortOrg)不是一个概念,他俩默认是相同的,但使用SetViewPortOrg函数后,就不相同了。
Windows定义了的8种映射方式:
映 射 方 式 | 逻 辑 单 位 | X 轴 增 加 | Y 轴 增 加 | 毫 米 |
MM_TEXT | 像 素 点 | 右 | 下 | 与 设 备 有 关 |
MM_LOMETRIC | 0. 1mm | 右 | 上 | 0.1 |
MM_HIMETRIC | 0. 01mm | 右 | 上 | 0.01 |
MM_LOENGLISH | 0. 254mm | 右 | 上 | 0.254 |
MM_HIENGLISH | 0. 0254mm | 右 | 上 | 0.0254 |
MM_TWIPS | 0.0176mm | 右 | 上 | 0.0176 |
MM_ISOTROPIC | 任 意(x=y) | 可 选 | 可 选 | 可 设 |
MM_ANISOTROPIC | 任 意(x!=y) | 可 选 | 可 选 | 可 设 |