MFC坐标空间与映射模式
逻辑坐标:使用GDI绘图时使用的坐标系
设备坐标系:实际设备(显示器、打印机)的坐标系,即我们实际看到的坐标系。
坐标空间
在Windows NT/2000中Win32 API中支持以下四层坐标空间:
- 世界坐标空间:引入World是为了对图像进行平移、缩放、剪切等操作,最大范围为232个单位高和232个单位宽,初始时X轴正向向右,Y轴正向向上,World坐标空间可以成为逻辑空间。
- 页面坐标空间(Page坐标空间):当没有World坐标空间时,它就是逻辑空间,最大范围是232高和宽。初始时,X正向向右,Y轴正向向上。
- 设备坐标空间(device坐标空间):设备空间,是坐标空间的常见目的地。最大坐标范围为227高和宽。X轴正向向右,Y轴正向向下,原点在物理设备左上角,我们不能改变这些规则。设备坐标空间用于设备描述表,一般是物理设备坐标空间的子集。
一个应用程序可以获得三种不同的显示设备对象句柄,每种句柄对应不同的屏幕区域。
第一个抽象设备是用户区对象,坐标原点位于用户区的左上角。此坐标系称为用户区坐标系。使用GetDC()或者BeginPaint()函数获得的句柄就是用户区的句柄。
第二个抽象坐标是全对象窗口,包括标题栏、选单、滚动杆和窗口框架等。此坐标系称为全窗口坐标系,原点在左上角。使用GetWindowsDC()可获得此设备对象句柄,CWindowsDC类生成的对象中的句柄m_hWnd也对应此坐标系。
第三个抽象坐标是屏幕坐标,称为屏幕坐标系。
- 物理设备坐标系(physical device空间):这一空间代表具体的物理设备,是我们实际能够看到的坐标空间,可是图形绘制的最终目的地。物理设备坐标空间是图形设备驱动程序使用的坐标空间。由一个固定宽度和高度的像素组成。最左方的像素坐标是(0,0),X轴的方向从左到右,Y轴的方向从上到下。也被称为屏幕坐标,GetWindowsRect返回的就是屏幕坐标,窗口消息也是使用屏幕坐标。
映射模式
坐标转化的需要确定三个要素:单位刻度值、方向和原点。用户可以根据实际问题的需求,构造一个满足条件的逻辑空间。映射模式是GDI将逻辑坐标转化为设备坐标的机制。一种映射模式通常有一个预定的窗口和视口,他们决定了坐标转化的刻度属性。应用程序可以改变窗口原点和视口原点。
窗口:逻辑坐标区间上的矩形区域。
视口:设备坐标空间中的一个矩形区域,如程序的客户区。
窗口决定了需要显示的几何模型的数量,视口位置决定了它在设备表面的显示位置。窗口和视口的尺寸比率决定了两种坐标的缩放比率。
映射模式通过以下函数改变:SetMapMode(int nMapMode)
windows支持以下的逻辑映射模式:
|
映射模式 |
说明 |
|
MM_ANISOTROPIC |
x,y的逻辑单位可以被独立地标注,在任何一个方向上都可以随意扩大,此模式不改变当前窗口的设置,正X轴向右,正Y轴向上 |
|
MM_HIENGLISH |
逻辑窗口中基本单位是0.001英寸,正X轴向右,正Y轴向上。 |
|
MM_MIMETRIC |
逻辑窗口中基本单位是0.01毫米,正X轴向右,正Y轴向上。 |
|
MM_ISOTROPIC |
逻辑窗口中基本单位是0.1毫米,正X轴向右,正Y轴向上。 |
|
MM_LOENGLISH |
逻辑窗口中基本单位是0.01英寸,正X轴向右,正Y轴向上。 |
|
MM_LOMETRIC |
逻辑窗口中基本单位是0.1毫米,正X轴向右,正Y轴向上。 |
|
MM_TEXT |
逻辑窗口中的基本单位单位为像素,正X轴向右,正Y轴向下 |
|
MM_TWIPS |
逻辑窗口中的基本单位为twip(1/1440英寸),正X轴向右,正Y轴向下。 |
默认映射模式为MM_TEXT
窗口与视口原点
- DWORD SetViewportOrg(HDC hDC,int x,int y)
用于设计视口原点(设备单位),返回以前视口单位原点(设备坐标)
- DWORD SetWindowOrg(HDC hDC,int x,int y)
用于设计窗口坐标的原点
两个函数不能一起使用,效果相同。
无论怎么改变窗口和视口的原点,Windows都将窗口原点变换到视口原点,并按当前的映射模式变换其余点。
MFC坐标空间与映射模式的更多相关文章
- GDI 映射模式(11)
概述 调用 SetMapMode 函数可以设置映射模式: int SetMapMode( HDC hdc, // 设备环境句柄 int fnMapMode // 要设置的映射模式 ); 同样,调用 G ...
- Shapefile文件中的坐标绘制到屏幕时的映射模式设置
pDC->SetMapMode(MM_ANISOTROPIC ); //首先选择MM_ANISOTROPIC映射模式,其它映射模式都不合适 pDC->SetWindowExt( max(a ...
- Visual C++ 打印编程技术-编程基础-映射模式
映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...
- 学习windows编程 day4 之 映射模式
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...
- D3.js学习笔记(四)—— 使用SVG坐标空间
目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...
- GDI绘图中的映射模式CDC::SetMapMode()
原文链接:http://blog.csdn.net/charlessimonyi/article/details/8264572 在GDI绘图前,一般要设置映射模式.映射模式是什么呢?它是逻辑长度单位 ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
- PHP 设计模式 笔记与总结(9)数据对象映射模式
[数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...
随机推荐
- HDU 2176
http://acm.hdu.edu.cn/showproblem.php?pid=2176 nim博弈的模型.要输出先手第一次取的情况,考虑角度是留给对手必败态 #include <iostr ...
- spring-websocket的搭建
Apach Tomcat 8.0.3+MyEclipse+maven+JDK1.7 spring4.0以后加入了对websocket技术的支持,撸主目前的项目用的是SSM(springMVC+spri ...
- ES6 - promise对象
Promise的设计初衷 我们使用ajax请求数据,得到数据后再对数据进行操作,可是有时候,对得到的数据进行操作的过程中,可能又要用到ajax请求,这时,我们的代码就变成了这样: $.ajax({ s ...
- 11g RAC集群启动关闭、各种资源检查、配置信息查看汇总。
简要:一:集群的启动与关闭 1. rac集群的手动启动[root@node1 bin]# ./crsctl start cluster -all2. 查看rac集群的状态[root@node1 bin ...
- C# 多线程详解 Part.01(UI 线程、子线程)
基本概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.一个进程至少有一个主线程. 什么是线程? 线程是程序中的一 ...
- 轻量级分布式 RPC 框架
@import url(/css/cuteeditor.css); 源码地址:http://git.oschina.net/huangyong/rpc RPC,即 Remote Procedure C ...
- Unable to create a constant value of type 'Closure type'
使用Linq to Entities的时候发生如下异常: Unable to create a constant value of type 'Closure type'. Only primitiv ...
- 【原创】Scrum模式也要根据自身特点微调,不能教条
手上的项目在用Scrum模式开发,运用的是禅道这个国产的平台,运作得还不错,具体如下: 1.整个开发团队有10个人,分为:新功能开发组和系统优化组,每组配备一个技术经理2.人员分在两个办公地点(同一城 ...
- 在命令行中通过adb shell am broadcast发送广播通知
通过命令行执行adb shell am broadcast发送广播通知. adb shell am broadcast 后面的参数有:[-a <ACTION>][-d <DATA_U ...
- FreeMarker模板引擎
现在开发的项目,也是基于SOA架构,每个功能接口都是用WebService实现,Web服务的通信协议就是用XML来传输. 以前写WebService都是自动生成XML,没想到这项目竟然要自己定义XML ...