Windows 对所有消息(如 WM_MOVE,WM_SIZE 和 WM_MOUSEMOVE),对所有非 GDI 函数,甚至对一些 GDI 函数,永远使用设备坐标。
由于映射方式是一种设备描述表属性,所以,只有对需要设备描述表句柄作参数的 GDI 函数,映射方式才会起作用。
Windows 将 GDI 函数中指定的逻辑坐标映射为设备坐标。
所有设备坐标系都以像素为单位,水平轴(即x轴)上的值从左到右递增,垂直轴(即y轴)上的值从上到下递增。
设备坐标系包括:“屏幕坐标”、“整窗口坐标”和“客户区坐标”。
屏幕坐标:
当我们使用整个屏幕时,就根据“屏幕坐标”进行操作。屏幕的左上角为(0,0)点,屏幕坐标用在 WM_MOVE 消息(对于非子窗口)以及下列 Windows 函数中:CreateWindow 和 MoveWindow(都是对于非子窗口)、GetMessagePos,GetCursorPos,SetCursorPos,GetWindowRect,以及 WindowFromPoint(这不是全部函数的列表)。
如果以 DISPLAY 为参数调用 CreateDC ,以获取整个屏幕的设备描述表,则默认情况下 GDI 调用中指定的逻辑坐标将被映射为屏幕坐标。
整窗口坐标:
“整窗口坐标”以程序的整个窗口为基准,如标题栏、菜单、滚动条和窗口框都包括在内。而对于普通窗口,点(0,0)是缩放边框的左上角。
整窗口坐标在 Windows 中极少使用,但是如果用 GetWindowDC 获取设备描述表,GDI 函数中的逻辑坐标就会转换为客户区坐标。
客户区坐标系:
点(0,0)是客户区的左上角。当使用 GetDC 或 BeginPaint 获取设备描述表时,GDI 函数中的逻辑坐标就会默认地转换为客户区坐标。
设备坐标系之间的转换:
用函数 ClientToScreen 和 ScreenToClient 可以将客户区坐标转换为屏幕坐标,或者反过来,将屏幕坐标转换为客户区坐标。
可以使用 GetWindowRect 函数获取屏幕坐标下的整个窗口的位置和大小。