第028讲:自定义的映射模式
知识点回顾:1. 视口范围和窗口范围
对于 MM_LOMETRIC 映射模式来说,窗口也是这么转换为视口的:
那在这里,视口范围 ViewExt 除以窗口范围 WinExt 的含义就是每一个逻辑单位应该对应多少像素:
总之,除了 MM_TEXT 映射模式外,其他几个我们学过的映射模式,视口范围除以窗口范围,得到的都是每个逻辑单位应该对应多少个像素。
2. ISOTROPIC 和 ANISOTROPIC
它们是两个物理术语,称为各向同性和各向异性。各向同性指物体的物理、化学等方面的性质不会因方向的不同而有所变化的这么一个特性,反之,物体如果在不同方向上的性能不同,则称之为各向异性。
那么在 Windows 这里,各向同性和各向异性指的是什么呢?
MM_ISOTROPIC 也就是各向同性,它会同比例地缩放两个坐标轴,使得x轴上的逻辑单位与y轴上的逻辑单位表示的物理尺寸是相同的。对于建立宽高比与显示设备无关的图像,这是很有帮助的。
窗口与视口之间的缩放范围,是通过同时设置 WinExt 和 ViewExt 来实现的。它们的值由 SetWindowExtEx 和 SetViewportExtEx 函数设置。不过这里要注意的是,应当在调用 SetViewportExtEx 函数之前先调用 SetWindowExtEx 函数。也就是先设置窗口范围,再设置视口范围,这样才能最有效地使用客户区空间。
下边代码使用 MM_ISOTROPIC 映射模式在客户区绘制一个圆形:
……
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int iMapMode;
static int cxClient, cyClient;
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
iMapMode = GetMapMode(hdc);
SetMapMode(hdc, MM_ISOTROPIC);
// 设置窗口的水平范围和垂直范围均为100,
SetWindowExtEx(hdc, 100, 100, NULL);
// 刚刚窗口的100逻辑范围相当于视口的1/2宽度和高度,
// 也就是说,整个客户区应该是长和宽都是200逻辑单位
SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL);
// 设置窗口的原点在视口的中间位置显示
SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);
// 在客户区的中间画一个半径是80的圆
Ellipse(hdc, -80, -80, 80, 80);
SetMapMode(hdc, iMapMode);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
MM_ISOTROPIC 映射模式你理解了之后,MM_ANISOTROPIC 映射模式就非常简单了:这个的话呢,Windows 是不会做比例的限制。
页:
[1]