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,否则部分窗口客户区可能会因落在窗口的逻辑范围之外而无法使用。
Windows绘图中的GDI映射模式的更多相关文章
- Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)
GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...
- GDI 映射模式(11)
概述 调用 SetMapMode 函数可以设置映射模式: int SetMapMode( HDC hdc, // 设备环境句柄 int fnMapMode // 要设置的映射模式 ); 同样,调用 G ...
- MFC坐标空间与映射模式
逻辑坐标:使用GDI绘图时使用的坐标系 设备坐标系:实际设备(显示器.打印机)的坐标系,即我们实际看到的坐标系. 坐标空间 在Windows NT/2000中Win32 API中支持以下四层坐标空间: ...
- GDI绘图中的映射模式CDC::SetMapMode()
原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...
- UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究
内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...
- Delphi中使用GDI+进行绘图(1)
Delphi的VCL类库中,默认使用的是GDI绘图接口,该接口封装了Win32 GDI接口,能够满足基本的绘图功能,但如果要实现更高级的绘图功能,往往比较困难,GDI+是微软在GDI之后的一个图形接口 ...
- [Qt2D绘图]-06QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题
本篇读书笔记主要记录QPainter的复合模式&&双缓冲绘图&&绘图中的其他问题 大纲: 复合模式 双缓冲绘图 绘图中的其他问题 ...
- Shapefile文件中的坐标绘制到屏幕时的映射模式设置
pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...
- VS2013中使用GDI+绘图
VC范例,400多个例子源代码下载 http://download.csdn.net/detail/bigtree_mfc/7727977 VS2013中使用GDI+绘图和VC6.0不同,在VC6.0 ...
随机推荐
- protobuf c++入门
1.在.proto文件中定义消息格式 2.使用protobuf编译器 3.使用c++ api来读写消息 0.为何使用protobuf? 1.原始内存数据结构,可以以二进制方式sent/save ...
- CCRepeatForever和CCDelayTime
有限次执行一组动作和无限次执行一组动作 void ActionRotateJerk::onEnter() { ActionsDemo::onEnter(); centerSprites(); CCFi ...
- 窗体彻底关闭事件FormClosed
//Application.Exit()是退出整个应用程序 Application.ExitThread();//强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题 System.Dia ...
- 使用filter导致服务器返回的页面始终是空白---在doFilter中漏写了chain.doFilter()
今天调代码的时候,突然发现,服务器开着,什么都没有问题,当我把下面这个filter给deploy了以后,访问所有的页面就都是空白. 后来发现,是因为在代码路径中,有一条路径没有调用filterChai ...
- Android几种layout(布局)的区别
1.FrameLayout:children按照从左上开始的顺序排列,主要用于tabed view或者图片切换功能:最简单的布局模型,在这种布局下每个添加的子控件都被放在布局的左上角,并覆盖在前一子控 ...
- FreeRTOS 独立看门狗监测任务执行状态
以下转载自安富莱电子: http://forum.armfly.com/forum.php 通过前面的几个章节,我们基本已经完成了 FreeRTOS 所有功能的讲解,本章节为大家介绍一种使用独立看门狗 ...
- dvwa 源码分析(三) --- config.inc.php分析
<?php # If you are having problems connecting to the MySQL database and all of the variables belo ...
- postgres入门介绍
mysql被oricle公司收购以后,PG就成了比较流行的开源数据库的首选,而且heroku上面不支持mysql,但是却大力支持PG,所以说,不得不学学PG,并非迫不得已的样子,至少以后PG会比较流行 ...
- Winform快速导出
public static void ExportExcel(DataGridView DataGridView01){ Stream stream = null; StreamWriter writ ...
- 一站式学习Wireshark(一):Wireshark基本用法
按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...