在几乎所有GDI函数中,坐标值使用的都是一种“逻辑单位”。
Windows必须将逻辑单位转换为“设备单位”。这种转换是由映射方式、窗口和视口的原点以及窗口和视口的范围所控制的。
表 windows的8种映射方式
Windows对所有消息(如WM_MOVE、WM_SIZE和WM_MOUSEMOVE),对所有非GDI函数,甚至对一些GDI函数,永远使用设备坐标。
屏幕坐标
屏幕的左上角为(0,0)点,屏幕坐标用在WM_MOVE消息(对于非子窗口)以及下列Windows函数中:CreateWindow和MoveWindow(都是对于非子窗口)、GetMessagePos、GetCursorPos、SetCursorPos、GetWindowRect以及WindowFromPoint(这不是全部函数的列表)。它们或者是与窗口无关的函数(如两个光标函数),或者是必须相对于某个屏幕点来移动(或者寻找)窗口的函数。
全窗口坐标
以程序的整个窗口为基准,标题栏、菜单、滚动条和窗口框都包括在内。而对于普通窗口,点(0,0)是缩放边框的左上角。全窗口坐标在Windows中极少使用,但是如果用GetWindowDC取得设备内容,GDI函数中的逻辑坐标就会转换为全窗口坐标。
客户区坐标
点(0,0)是客户区的左上角。当使用GetDC或BeginPaint取得设备内容时,GDI函数中的逻辑坐标就会内定转换为客户区坐标。
对于所有的映像方式,Windows都用下面两个公式来将窗口(逻辑)坐标转化为视口(设备)坐标:
其中,(xWindow,yWindow)是待转换的逻辑坐标点,(xViewport,yViewport)是转换后的设备坐标点,一般情形下差不多就是客户区坐标
(xWinOrg,yWinOrg)是逻辑坐标的窗口原点;(xViewOrg,yViewOrg)是设备坐标的视端口原点
xWinExt,yWinExt)是逻辑坐标的窗口范围(xViewExt,yViewExt)是设备坐标的窗口范围。
在多数方式映射中,范围是映射方式所隐含的,不能够改变。
Windows用以下公式将视口(设备)坐标转换为窗口(逻辑)坐标: