对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,否则部分窗口客户区可能会因落在窗口的逻辑范围之外而无法使用。

Windows绘图中的GDI映射模式的更多相关文章

  1. Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)

    GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...

  2. GDI 映射模式(11)

    概述 调用 SetMapMode 函数可以设置映射模式: int SetMapMode( HDC hdc, // 设备环境句柄 int fnMapMode // 要设置的映射模式 ); 同样,调用 G ...

  3. MFC坐标空间与映射模式

    逻辑坐标:使用GDI绘图时使用的坐标系 设备坐标系:实际设备(显示器.打印机)的坐标系,即我们实际看到的坐标系. 坐标空间 在Windows NT/2000中Win32 API中支持以下四层坐标空间: ...

  4. GDI绘图中的映射模式CDC::SetMapMode()

    原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...

  5. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  6. Delphi中使用GDI+进行绘图(1)

    Delphi的VCL类库中,默认使用的是GDI绘图接口,该接口封装了Win32 GDI接口,能够满足基本的绘图功能,但如果要实现更高级的绘图功能,往往比较困难,GDI+是微软在GDI之后的一个图形接口 ...

  7. [Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题

    本篇读书笔记主要记录QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题   大纲:     复合模式     双缓冲绘图     绘图中的其他问题       ...

  8. Shapefile文件中的坐标绘制到屏幕时的映射模式设置

    pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...

  9. VS2013中使用GDI+绘图

    VC范例,400多个例子源代码下载 http://download.csdn.net/detail/bigtree_mfc/7727977 VS2013中使用GDI+绘图和VC6.0不同,在VC6.0 ...

随机推荐

  1. eclipse ant 的自动部署(autobulid)

    在写项目中,经常需要在 ctrl+s的时候自动编译并且把这个改动的文件copy至某个目录,除了eclipse自带 java脚本的web自动部署到项目中配置的目录下,但是不能随心所欲copy,比如其他文 ...

  2. c++之——重载、重写、重定义

    函数重载: 必须在同一个类中进行: 子类无法重载父类的函数,父类同名函数将被子类名称覆盖: 重载是在编译期间根据参数类型和个数决定函数的调用(静态联编). 函数重写与重定义: 重写: 必须发生在基类和 ...

  3. c++全局函数 && 成员函数

    #include<iostream> using namespace std; class Test { public: Test(, ) { this->a = a; this-& ...

  4. poj2018(高精度二分+dp)

    题意:给你n个数,要你在这n个数里面找到一些连续的数,这些数的数量大于等于m,并且他们的平均值在这n个数里面是最大的....... 思路:先把n个数的最大最小值确定,然后二分枚举平均值,对于每一个连续 ...

  5. 大数据之ETL工具Kettle的--1功能介绍

    Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行. 说白了就是,很有必要去理解一般ETL工具必备的特性和功能,这样才更好的掌握Kettle的使用. ...

  6. git工作流教程

    简介:在用git进行开发时,需要规范化,这时用git工作流来规范化,软件开发过程 https://github.com/oldratlee/translations/blob/master/git-w ...

  7. lighttpd + php 移植配置

    buildroot 内添加 lighttpd 和php 等相关选项 // make menuconfig Target packages ---> Interpreter languages a ...

  8. [posix]Posix多线程编程

    就不排版了,可以到原作者博客下看 转自:http://www.cnblogs.com/zhangsf/archive/2013/09/09/3309867.html 目录表  摘要 译者序 Pthre ...

  9. win8.1 64位安装oracle10g客户端心得

    方法同win7 64位安装方法(http://www.cnblogs.com/winkey4986/p/3683568.html)下载Oracle 10g的客户端程序,文件名是 10201_clien ...

  10. win7怎么把软件加入开机启动项

    点击开机菜单进入. 2 然后点击菜单栏中的所有程序. 3 在所有程序中找到‘启动’,这个启动就是开机启动项来的. 4 右键进行打开启动项. 5 把快捷方式复制到开机启动项中.如果找不到快捷方式可以右键 ...