Windows定义了8中映射模式,她们在WINGDI.H中定义的标识符如下:
映射模式 |
逻辑单位 |
X轴 |
Y轴 |
MM_TEXT |
像素 |
右 |
下 |
MM_LOENGLISH |
0.1mm |
右 |
上 |
MM_HIMETRIC |
0.01mm |
右 |
上 |
MM_LOENGLISH |
0.01in |
右 |
上 |
MM_HIENGLISH |
0.001in |
右 |
上 |
MM_TWIPS |
1/1440in |
右 |
上 |
MM_ISOTROPIC |
任意(x=y) |
可选 |
可选 |
MM_ANISOTROPIC |
任意(x!=y) |
可选 |
可选 |
映射模式 |
视口范围(x,y) |
窗口范围(x,y) |
MM_LOMETRIC |
(96,96) |
(254,-254) |
MM_HIMETRIC |
(96,96) |
(2540,-2540) |
MM_LOENGLISH |
(96,96) |
(100,-100) |
MM_HIENGLISH |
(96,96) |
(1000,-1000) |
MM_TWIPS |
(96,96) |
(1440,-1440) |
上面两个表格挺重要的。
映射模式可以由下面的函数设置
SetMapMode(hdc,iMapMode);
下面介绍几个重要的概念(截取自Windows程序设计第五版)
一、坐标系统
在Windows应用程序中,有两种坐标系统:设备坐标和逻辑坐标。
设备坐标系统直接与硬件设备的显示相关,以像素为度量单位。水平轴(X轴)的正方向从左向右,垂直轴(Y轴)的方向从上向下,并且整个坐标轴的单位和方向固定不变。
逻辑坐标系统与设备描述表的属性映射模式相关,它是一种允许自定义的坐标系统,坐标轴方向、单位和原点位置都可以重新定义。cm,mm,in等为单位
逻辑坐标系统下绘出的图形必须映射到设备坐标系统下,才能在屏幕上显示出来。
二、窗口和视口
窗口和视口是Windows GDI中两个很重要的概念,从逻辑坐标映射为设备坐标实际上就是从窗口到视口的映射。
视口是基于设备坐标的,它以像素为单位,且有视口原点和视口范围两个基本属性。在使用客户区设备坐标时,视口与客户区相同,视口原点在默认情况下位于客户区的左上角,Y轴向下为正方向。可以更改视口原点的位置,也可以更改坐标轴的正方向。
窗口是基于逻辑坐标的,窗口逻辑坐标的单位可以是像素、英寸等,还可以自定义。窗口也有窗口原点和窗口范围两个基本属性,窗口原点被映射到视口原点,窗口范围与视口范围的比值定义为映射的换算因子。
SetWindowOrgEx设置窗口原点,SetViewportOrgEx设置视口原点
放大缩小倍数约等于窗口范围/适口范围(表格二中的倍数基本是不变的)
SetMapMode(hdc,MM_LOENGLISH);
SetViewportOrgEx(hdc,0,cyClient,NULL);
SetMapMode(hdc,MM_LOENGLISH);
SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);
自定义的映射模式
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,cxClient,cyClient,NULL);//1:1比例
SetViewportExtEx(hdc,cxClient,-cyClient,NULL);//这里为啥有个负数,待会解释
SetViewportOrgEx(hdc,0,cyClient,NULL);
SetMapMode(hdc,MM_ANISOTROPIC);
SetWindowExtEx(hdc,1000,1000,NULL);
SetViewportExtEx(hdc,cxClient,-cyClient,NULL);
SetViewportOrgEx(hdc,0,cyClient,NULL);
有人不明白为什么这里用负数,按照下面的公式,就可以算出来是负数。
xViewport=(xWindow-xWindowOrg)*(xViewPortExt/xWindowExt)+xViewportOrg
yViewport=(yWindow-yWindowOrg)*(yViewPortExt/yWindowExt)+yViewportOrg
有较好伸缩效果。
分享到:
相关推荐
GDI MM_HIMETRIC映射模式为逻辑单位毫米而非像素.7z
Broland C++ Builder 中的 Gdiplus(GDI+)浅析.
VC 例说Windows窗口、视口以及GDI映射模
本文从GDI 映射方式入手, 对基于设备坐标的视口和基于逻辑坐标的窗口的概念、内涵及其相互关系进行了分析介绍。在此基础上, 文章详述了怎样建立不同原点、单位和正方向的逻辑坐标系, 对坐标系的构建原理进行了深入...
GDI MM_ISOTROPIC映射模式只能画正圆MM_ANISOTROPIC可以画椭圆SetWindowExt,SetViewportExt设置屏幕区最大范围
易语言GDI渐变模式源码,GDI渐变模式,取指针,置指针,方法_置指针,new,delete,销毁,创建自窗口句柄,创建自DC,创建自图像,获取DC,释放DC,取混合模式,置混合模式,取渲染原点,置渲染原点,取混合品质,置混合品质,置平滑...
GDI渐变模式.rar
易语言源码易语言GDI渐变模式源码.rar
易语言GDI渐变模式源码.zip
GDI GDI GDI GDI GDI GDI GDI
模拟屏幕 XML存储屏幕设置 GDI绘图 单例模式运用
1.双缓冲模式下设置映射模式; 2.比较MM_ANISOTROPIC和MM_ISOTROPIC的异同; 3.SetViewportExt和SetWindowExt函数的使用
Broland C++ Builder 中的 Gdiplus(GDI+)浅析,是你学习界面编程的最好资料!!
在我们进行绘图程序的开发时,不可避免地会遇到坐标映射的问题,而这恰恰是一个很伤脑筋、绕也绕不明白的问题。我就经常为此而一卡就是几个小时,恨得要命,终于有一天心一横,豁出一个周末的晚上,啃了所有找得到的...
GDI 映射模式的修改 , 简单测试代码啊
C#GDI+小游戏 飞机大战C#GDI+小游戏 飞机大战C#GDI+小游戏 飞机大战C#GDI+小游戏 飞机大战C#GDI+小游戏 飞机大战
GDI+的说明 GDI+的说明 GDI+的说明 GDI+的说明
8.3 使用颜色对象应用颜色映射 8.4 图像属性和ImageAttributes类 8.5 编码器参数与图像格式 总结 第9章 高级二维图形 9.1 线帽和线条样式 9.2 理解并使用图形路径 9.3 图形容器 9.4 读取图像的元数据 9.5 ...
C#GDI绘图C#GDI绘图C#GDI绘图C#GDI绘图C#GDI绘图C#GDI绘图
GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图GDI绘图