zoukankan      html  css  js  c++  java
  • Windows绘图中的GDI映射模式

      

      对Windows编程新手来说,GDI编程中最困难的部分就是映射模式(Mapping Mode)。

          什么是映射模式?

          我们知道,GDI画图是在设备描述表这个逻辑意义上的显示平面上进行,其使用的是逻辑坐标,简单地说,映射模式就是设备描述表的属性,用于确定从逻辑坐标到设备坐标值的转换方式。

           Windows支持8中映射模式:MM_TEXT为默认。

       

      

      /* Mapping Modes

           #define MM_TEXT                   1

           #define MM_LOMETRIC           2

           #define MM_HIMETRIC            3

           #define MM_LOENGLISH          4

           #define MM_HIENGLISH           5

           #define MM_TWIPS                6

           #define MM_ISOTROPIC           7

           #define MM_ANISOTROPIC       8

           */

          

           CDC* pDC = GetDC();

           // 默认映射模式 MM_TEXT

          pDC->Ellipse(0, 0, 100, 100);

           // 设置映射模式 MM_LOMETRIC   y向下为负 0.1mm

           pDC->SetMapMode(MM_LOMETRIC);

           pDC->Ellipse(0, 0, 100, -100);

           // 设置映射模式 MM_HIMETRIC   y向下为负 0.01mm

           pDC->SetMapMode(MM_HIMETRIC);

           pDC->Ellipse(0, 0, 100, -100);

           // 设置映射模式 MM_LOENGLISH   y向下为负 0.01in  0.254mm    1英寸(in)=25.4毫米(mm)

           pDC->SetMapMode(MM_LOENGLISH);

           pDC->Ellipse(0, 0, 100, -100);

           // 设置映射模式 MM_HIENGLISH   y向下为负 0.001in 0.0254mm   1英寸(in)=25.4毫米(mm)

           pDC->SetMapMode(MM_HIENGLISH);

           pDC->Ellipse(0, 0, 100, -100);

           // 设置映射模式 MM_TWIPS   y向下为负 0.0007in   1英寸(in)=25.4毫米(mm)

       pDC->SetMapMode(MM_TWIPS);

       pDC->Ellipse(0, 0, 100, -100);

           /* 可编程映射模式 */

           // 根据窗口尺寸按比例自动调节画图的输出大小

           CRect rect;

           GetClientRect(&rect);

           // 各向异性 MM_ANISOTROPIC

           pDC->SetMapMode(MM_ANISOTROPIC);

           pDC->SetWindowExt(100, 100);

           pDC->SetViewportExt(rect.Width(), rect.Height());

           pDC->Ellipse(0, 0, 100, 100);

           pDC->SetMapMode(MM_ANISOTROPIC);

           pDC->SetWindowExt(100, -100);

           pDC->SetViewportExt(rect.Width(), rect.Height());

           pDC->Ellipse(0, 0, 100, -100);

           //各向同性  MM_ISOTROPIC

           pDC->SetMapMode(MM_ISOTROPIC);

           pDC->SetWindowExt(100, -100);

           pDC->SetViewportExt(rect.Width(), rect.Height());

           pDC->Ellipse(0, 0, 100, -100);

           pDC->SetMapMode(MM_ISOTROPIC);

           pDC->SetWindowExt(100, -100);

           pDC->SetViewportExt(rect.Width(), rect.Height());

           pDC->Ellipse(0, 0, 100, -100);

      

       CDC::SetWindowExt             设定“窗口范围”

           CDC::SetViewportExt           设定“视口范围”

           可以这样认为,窗口的尺寸以逻辑单位计算,视口的尺寸以设备尺寸或像素点计算。

           需要注意的是,在MM_ISOTROPIC模式下,应该首先调用SetWindowExt,否则部分窗口客户区可能会因落在窗口的逻辑范围之外而无法使用。

  • 相关阅读:
    【Python 开发】第三篇:python 实用小工具
    【Python 开发】第二篇 :Python安装
    【Linux 运维】 安装PHP工具Composer
    【shell 每日一练6】初始化安装Mysql并修改密码
    【zabbix 监控】第三章 创建主机组和主机
    【Docker】第一篇 Docker的初始化安装部署
    【shell 练习5】编写简单的多级菜单
    【zabbix 监控】第二章 安装测试被监控主机
    【zabbix 监控】第一章 zabbix的安装配置
    1数组和字符串题解
  • 原文地址:https://www.cnblogs.com/MakeView660/p/6537384.html
Copyright © 2011-2022 走看看