换算因子:xViewExt/xWinExt
MM_ISOTROPIC
将映像方式设定为MM_ISOTROPIC时,Windows使用与MM_LOMETRIC同样的窗口和视端口范围。
MM_ISOTROPIC模式下的SetViewportExtEx函数中,Windows将自动调整x与y的值,以确保X轴与Y轴逻辑坐标单位相同。Windows不会调整SetWindowExtEx。
逻辑坐标单位为1/16英寸:
SetMapMode(hdc, MM_ISOTROPIC);
SetWindowExtEx(hdc, 160 * GetDeviceCaps(hdc, HORZSIZE) / 254, 160 * GetDeviceCaps(hdc, VERTSIZE) / 254, NULL);
SetViewportExtEx(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES), NULL);
视口范围设定为按像素计算的整个屏幕大小,窗口范围则必须设定为以1/16英寸为单位的整个屏幕大小。GetDeviceCaps以HORZSIZE和VERTSIZE为参数,传回以毫米为单位的设备尺寸。如果使用浮点数,将把毫米数除以25.4,转换为英寸,然后,再乘以16以转换为1/16英寸。但是,由于我们使用的是整数,所以先乘以160,再除以254。
换算因子的计算公式如下:
GetDeviceCaps(hdc, HORZRES) / (160 * GetDeviceCaps(hdc, HORZSIZE) / 254)
GetDeviceCaps(hdc, VERTRES) / (160 * GetDeviceCaps(hdc, VERTSIZE) / 254)
当逻辑坐标与设备坐标转换时,Windows将以此换算因子进行转换。
SetWindowExtEx与SetViewportExtEx仅用来改变换算因子。(改变逻辑坐标单位的尺寸)
MM_ANISOTROPIC
SIZE size;
SetMapMode(hdc, MM_LOENGLISH);
SetMapMode(hdc, MM_ANISOTROPIC);
GetViewportExtEx(hdc, &size); // size.cx = 1024,size.cy = -768
SetViewportExtEx(hdc, size.cx, -size.cy, NULL); // -size.cy 改变Y轴方向。