逻辑坐标:使用GDI绘图时使用的坐标系

设备坐标系:实际设备(显示器、打印机)的坐标系,即我们实际看到的坐标系。

坐标空间

在Windows NT/2000中Win32 API中支持以下四层坐标空间:

  1. 世界坐标空间:引入World是为了对图像进行平移、缩放、剪切等操作,最大范围为232个单位高和232个单位宽,初始时X轴正向向右,Y轴正向向上,World坐标空间可以成为逻辑空间。
  2. 页面坐标空间(Page坐标空间):当没有World坐标空间时,它就是逻辑空间,最大范围是232高和宽。初始时,X正向向右,Y轴正向向上。
  3. 设备坐标空间(device坐标空间):设备空间,是坐标空间的常见目的地。最大坐标范围为227高和宽。X轴正向向右,Y轴正向向下,原点在物理设备左上角,我们不能改变这些规则。设备坐标空间用于设备描述表,一般是物理设备坐标空间的子集。

    一个应用程序可以获得三种不同的显示设备对象句柄,每种句柄对应不同的屏幕区域。

    第一个抽象设备是用户区对象,坐标原点位于用户区的左上角。此坐标系称为用户区坐标系。使用GetDC()或者BeginPaint()函数获得的句柄就是用户区的句柄。

    第二个抽象坐标是全对象窗口,包括标题栏、选单、滚动杆和窗口框架等。此坐标系称为全窗口坐标系,原点在左上角。使用GetWindowsDC()可获得此设备对象句柄,CWindowsDC类生成的对象中的句柄m_hWnd也对应此坐标系。

    第三个抽象坐标是屏幕坐标,称为屏幕坐标系。

  4. 物理设备坐标系(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

窗口与视口原点

  1. DWORD SetViewportOrg(HDC hDC,int x,int y)

用于设计视口原点(设备单位),返回以前视口单位原点(设备坐标)

  1. DWORD SetWindowOrg(HDC hDC,int x,int y)

用于设计窗口坐标的原点

两个函数不能一起使用,效果相同。

无论怎么改变窗口和视口的原点,Windows都将窗口原点变换到视口原点,并按当前的映射模式变换其余点。

MFC坐标空间与映射模式的更多相关文章

  1. GDI 映射模式(11)

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

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

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

  3. Visual C++ 打印编程技术-编程基础-映射模式

    映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...

  4. 学习windows编程 day4 之 映射模式

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  5. D3.js学习笔记(四)—— 使用SVG坐标空间

    目标 在这一章,你将要使用D3.js基于一些数据把SVG元素添加到你想要的坐标位置上. 我们的目标就是使用下面的数据集: var spaceCircles = [30,70,110]; 并使用D3.j ...

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

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

  7. php设计模式 数据对象映射模式

    数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...

  8. PHP 设计模式 笔记与总结(10)数据对象映射模式 2

    [例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...

  9. PHP 设计模式 笔记与总结(9)数据对象映射模式

    [数据对象映射模式] 是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作.例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数 ...

随机推荐

  1. Android GPS定位 获取经纬度

    移动 是手机与手持设备的最大特点,可以通过Eclipse的DDMS视图,模拟设备的位置变化,改变经纬度后,点击send,然后运行程序,在应用程序中,动态的获取设备位置,然后显示当前的位置信息. 获取位 ...

  2. JS运动基础(二) 摩擦运动、缓冲运动

    摩擦运动: 逐渐变慢,最后停止 缓冲运动: 与摩擦力的区别:可以精确的停到指定目标点距离越远速度越大速度由距离决定速度=(目标值-当前值)/缩放系数Bug:速度取整值取整: iSpeed = iSpe ...

  3. sql语句与 数据库

    create  table  wyx( xh int primary key, xm varchar(20) not null, nl int, zcrq timestamp default curr ...

  4. 图论--最近公共祖先问题(LCA)模板

    最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解 ...

  5. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

  6. Docker SSH+NGHINX+MYSQL

    1.添加创建镜像的配置文件      vim Dockerfile      输入以下内容: FROM jdeathe/centos-sshMAINTAINER baxk"xxx@hongh ...

  7. go_databasetest

    go_databasetest go语言的数据库测试: go get github.com/Go-SQL-Driver/MySQL package main import ( _"githu ...

  8. SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表

    create table a(id  varchar(20) primary key,password varchar(20) not null) create table b(id int iden ...

  9. JavaScript中的Array

    Array类型是ECMAScript 用的最多的类型了,ECMAScript中的数组每一项可以保存任何类型的数据,也就是说,数组的第一个项保存字符串,用第二个保存数值,用第三个位置来保存对象.二千数据 ...

  10. xml中数据存储 <![CDATA[ … ]]>

    在xml中  有些可能是 转义的字符  比如像<等  &符号,  你没发现 在加参数后面要进行转义 写成&#26: 可以是&  但是每处都要 这么写.  在未来不可控的 ...