鱼C论坛

 找回密码
 立即注册
查看: 3106|回复: 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 映射模式在客户区绘制一个圆形:

  1. ……
  2. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  3. {
  4.         HDC hdc;
  5.         PAINTSTRUCT ps;
  6.        
  7.         int iMapMode;
  8.         static int cxClient, cyClient;
  9.        
  10.         switch (message)
  11.         {
  12.         case WM_SIZE:
  13.                 cxClient = LOWORD(lParam);
  14.                 cyClient = HIWORD(lParam);
  15.                 return 0;

  16.         case WM_PAINT:
  17.                 hdc = BeginPaint(hwnd, &ps);

  18.                 iMapMode = GetMapMode(hdc);
  19.                 SetMapMode(hdc, MM_ISOTROPIC);

  20.                 // 设置窗口的水平范围和垂直范围均为100,
  21.                 SetWindowExtEx(hdc, 100, 100, NULL);
  22.                
  23.                 // 刚刚窗口的100逻辑范围相当于视口的1/2宽度和高度,
  24.                 // 也就是说,整个客户区应该是长和宽都是200逻辑单位
  25.                 SetViewportExtEx(hdc, cxClient / 2, cyClient / 2, NULL);

  26.                 // 设置窗口的原点在视口的中间位置显示
  27.                 SetViewportOrgEx(hdc, cxClient / 2, cyClient / 2, NULL);

  28.                 // 在客户区的中间画一个半径是80的圆
  29.                 Ellipse(hdc, -80, -80, 80, 80);

  30.                 SetMapMode(hdc, iMapMode);

  31.                 EndPaint(hwnd, &ps);
  32.                 return 0;

  33.         case WM_DESTROY:
  34.                 PostQuitMessage(0);
  35.                 return 0;
  36.         }

  37.         return DefWindowProc(hwnd, message, wParam, lParam);
  38. }
复制代码

2.png

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


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-23 20:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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