映射模式:逻辑单位和设备单位
映射模式:
修改映射模式之后应该修改回来 int
当 GDI 函数将输出送到某个物理设备上时,Windows 必须将逻辑坐标转换成设备单位(如显示器的像素点)。
逻辑单位和设备单位的转换是由映射模式决定的,映射模式被储存在设备环境中。
每个逻辑单位的大小由映射模式决定,这个逻辑单位既可以与设备单位(显示器的一个像素点)相同,也可以是一种物理单位(如 1 毫米),还可以是用户自定义的一种单位。在 Windows 应用程序中,只要与输出有关系,都要使用映射模式。
修改映射模式时注意方向
MM_TEXT
MM_LOMETRIC
MM_HIMETRIC
MM_LOENGLISH
MM_HIENGLISH
MM_TWIPS
MM_ISOTROPIC
MM_ANISOTROPIC
映射模式的转换公式
xView = (xWindow - xWinOrg) * ( xViewExt / xWinExt ) + xViewOrg
yView = (yWindow - yWinOrg) * ( yViewExt / yWinExt ) + yViewOrg
xWindow = (xViewport - xViewOrg) * ( xWinExt / xViewExt ) + xWinOrg
yWindow = (yViewport - yViewOrg) * ( yWinExt / yViewExt ) + yWinOrg
Windows 对所有的消息,所有的非 GDI 函数,以及一些 GDI 函数,都继续使用设备坐标(也就是像素为单位)。 只有当使用以设备环境句柄作为参数的 GDI 函数时,映射模式才会生效。(并无绝对)
设备坐标系统:
所有的消息和非GDI以及一些GDI函数,使用设备坐标(单位像素)
1. 屏幕坐标, WM_MOVE消息
等函数,使用屏幕坐标。 这些函数一般分两类:一类是与窗口无关的函数(例如两个和鼠标指针相关);另一类是必须根据屏幕上的点移动或寻找窗口的函数。如果使用带“DISPLAY”参数的 CreateDC 函数来获取整个屏幕的设备环境,那么在 GUI 调用中,逻辑坐标值将默认映射到屏幕坐标。
2. 全窗口坐标, 全窗口坐标在 Windows 中很少用,但是如果设备环境是从 GetWindowsDC 函数获取的,则在 GDI 函数调用中,逻辑坐标会被默认映射为全窗口坐标。
3. 客户区坐标, 调用 [InvalidCharacterError: "hr<" did not match the Name production] 或 BeginPaint 函数获取设备环境时,在 GDI 函数中的逻辑坐标将被默认转换为客户区坐标。
可以使用 [InvalidCharacterError: "underline;"" did not match the Name production][InvalidCharacterError: "underline;"" did not match the Name production] 函数将客户区坐标转换到屏幕坐标,反之,调用 ScreenToClient 函数把屏幕坐标转换到客户区坐标。也可以调用 GetWindowRect 函数以屏幕坐标的形式获取整个窗口的位置和大小。这三个函数为把任何一种设备坐标转换为另一种设备坐标提供了足够的信息。
视口和窗口
窗口:
和逻辑坐标系统是等同的(映射模式决定)(编程)
视口:
和设备坐标系统是等同的(永远是像素)(显示)
映射模式
先设置窗口,后设置视口
xView = (xWindow - xWinOrg) * ( xViewExt / xWinExt ) + xViewOrg
yView = (yWindow - yWinOrg) * ( yViewExt / yWinExt ) + yViewOrg
MM_TEXT(默认)
约定
xWinExt / xViewExt = 0.1
yWinExt / yViewExt = 0.1
MM_LOMETRIC
约定
xWinExt / xViewExt = 0.1 毫米中的水平像素数
yWinExt / yViewExt = 0.1 毫米中的垂直像素数
MM_ISOTROPIC和MM_ANISOTROPIC
各向同性和各向异性(允许修改坐标轴的方向, 默认上右为正)
MM_ISOTROPIC:各向同性, 同比例地缩放两个坐标轴,使得x轴上的逻辑单位与y轴上的逻辑单位表示的物理尺寸是相同的。(半受限映射模式)
窗口的范围对应视口的范围, 当视口的尺寸改变时, 逻辑坐标对应的像素坐标也发生改变(即比例随之发生改变, 但是x比例和y比例是相同的, 如果不同则选择比例较小的), 所以绘制的图形会随着窗口的放大或缩而发生改变
SetMapMode(hdc, MM_ISOTROPIC);
SetWindowExtEx(hdc, 100, 200, NULL);
SetViewportExtEx(hdc, 100, 300, NULL);
则比例为 2 : 3, 2个逻辑单位对应1个像素单位。x轴的逻辑范围100, y轴的逻辑范围200。
SetViewportExtEx(hdc, cxClient, cyClient, NULL);
MM_ANISOTROPIC(不受限映射模式)
windows不会干涉比例