鱼C论坛

 找回密码
 立即注册
查看: 2859|回复: 0

[知识点备忘] 第028讲:自定义的映射模式

[复制链接]
发表于 2016-3-13 01:49:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点回顾:

1. 视口范围和窗口范围

对于 MM_LOMETRIC 映射模式来说,窗口也是这么转换为视口的:

搜狗截图20160313012111.png

那在这里,视口范围 ViewExt 除以窗口范围 WinExt 的含义就是每一个逻辑单位应该对应多少像素:

搜狗截图20160313012213.png

总之,除了 MM_TEXT 映射模式外,其他几个我们学过的映射模式,视口范围除以窗口范围,得到的都是每个逻辑单位应该对应多少个像素。


2. ISOTROPIC 和 ANISOTROPIC

它们是两个物理术语,称为各向同性和各向异性。各向同性指物体的物理、化学等方面的性质不会因方向的不同而有所变化的这么一个特性,反之,物体如果在不同方向上的性能不同,则称之为各向异性。

那么在 Windows 这里,各向同性和各向异性指的是什么呢?

MM_ISOTROPIC 也就是各向同性,它会同比例地缩放两个坐标轴,使得x轴上的逻辑单位与y轴上的逻辑单位表示的物理尺寸是相同的。对于建立宽高比与显示设备无关的图像,这是很有帮助的。

窗口与视口之间的缩放范围,是通过同时设置 WinExt 和 ViewExt 来实现的。它们的值由 SetWindowExtExSetViewportExtEx 函数设置。不过这里要注意的是,应当在调用 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);
}

2.png

MM_ISOTROPIC 映射模式你理解了之后,MM_ANISOTROPIC 映射模式就非常简单了:这个的话呢,Windows 是不会做比例的限制。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表