窗口和视口

视口是基于设备的采用的是设备坐标(单位:像素),窗口是基于程序的采用的是逻辑坐标(单位:像素/毫米/厘米等)。

在默认的映射模式下,视口是与窗口等同的。但是如果改变其映射模式,则其对应的单位则不相同。

一般映射模式

如果将映射模式改为MM_LOENGLISH或MM_LOMETRIC等,则1个设备坐标并不对应一个逻辑坐标,因为其单位不同。而且对于不同的映射模式而言其逻辑单位都是固定的。

可编程映射模式

如果将映射模式改为MM_ANISOTROPIC或MM_ANISOTROPIC,则其逻辑单位是可以自己决定的。那么如何设置其逻辑单位呢?

MM_ANISOTROPIC模式

对于此模式而言,其可以设置逻辑单位。且其表示各向异性,也就是说在逻辑坐标上横坐标的一个单位并不一定等于纵坐标的一个单位(当然也可以等于)。

CPaintDC dc(this);
dc.SetMapMode(MM_ANISOTROPIC); //设置映射模式
dc.SetWindowExt(10,10); //设置窗口范围
dc.SetViewportExt(20,20); //设置视口范围 dc.Ellipse(0,0,50,50);

以上代码通过设置窗口范围和视口范围来设置逻辑单位,其设置窗口范围为(10,10),视口范围为(20,20)。也就是横坐标上一个逻辑坐标表示2个设备坐标(即单位为2像素),纵坐标上也是一个逻辑坐标表示2个设备坐标(即单位为2像素)。其画出来的是一个直径为50 * 2 像素的圆形。

如果将视口范围改为(20,30),则纵坐标上一个逻辑坐标表示3个设备坐标(即单位为3像素)dc.SetViewportExt(20,30);,那么其画出来的就是一个短轴为50 * 2像素,长轴为50 * 3像素的椭圆。这就是此映射模式的各项异性特点,即横坐标上的单位不等于纵坐标的单位。

MM_ISOTROPIC模式

对于此模式而言,其也可以设置逻辑单位。且其表示各向同性,也就是说在逻辑坐标上横坐标的一个单位等于纵坐标的一个单位。

CPaintDC dc(this);
dc.SetMapMode(MM_ANISOTROPIC); //设置映射模式
dc.SetWindowExt(10,10); //设置窗口范围
dc.SetViewportExt(20,30); //设置视口范围 dc.Ellipse(0,0,50,50);

以上代码设置窗口范围为(10,10),视口范围为(20,30),但是因为其有各项同性,所以为使其横纵坐标单位相等需要取在横纵坐标上单位最小的一个。也就是1个逻辑单位对应2个设备单位(2个像素)。所以这里画的是个直径为50 * 2像素的圆形

逻辑坐标系和设备坐标系

设备坐标系是固定的单位1像素,原点位于客户区左上角。

逻辑坐标系的单位可以使像素/毫米/厘米等,原点和XY轴的方向也可以改变。GDI函数一般都是基于逻辑坐标的。

GDI编程基础的更多相关文章

  1. GDI 编程基础简介

    今天准备重新对GDI的知识进行回顾一下,以便加深认识. 一.GDI 在进行Windows编程时,可能经常会用到设备描述表的类型句柄,例如,最厂家的HDC,它就是图像设备描述类型句柄.因为GDI的绘图函 ...

  2. C#GDI+编程基础(一:Graphics画布类)

    GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...

  3. C#GDI+编程基础(二)

    pen类:绘制指定宽度和样式的直线.使用DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理. 创建画笔: //用指 ...

  4. C#_GDI+详细教程(图形图像编程基础)

    第7章  C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1  GDI+绘图基础 编写图形程序时需要使用GDI( ...

  5. GDI+(一):GDI+ 绘图基础

    一.GDI+绘图基础 编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数. ...

  6. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  7. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  8. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  9. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式

    前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...

随机推荐

  1. python实现通过URL下载图片到本地服务器

    import os import urllib.request image_url = 'http://img.jingtuitui.com/759fa20190115144450401.jpg' f ...

  2. Prometheus时序数据库-数据的查询

    Prometheus时序数据库-数据的查询 前言 在之前的博客里,笔者详细阐述了Prometheus数据的插入过程.但我们最常见的打交道的是数据的查询.Prometheus提供了强大的Promql来满 ...

  3. 让 Java 中 if else 更优雅的几个小技巧

    对于一个高级 crud 工程师‍而言,if else 是写代码时使用频率最高的关键词之一,然而有时过多的 if else 会让我们优雅的 crud 代码显得不那么优雅,并且感到脑壳疼

  4. django 自带的用户系统

    首先,我要说明一下,下面内容不是必须品,如果各位大神喜欢手写也是可以的,你也可以选择自带的功能来缩减你的代码量,提高效率! 第一步 系统配置用户表 首先,在models中创建用户表,导包 from d ...

  5. 【LiteOS】Liteos移植篇

    目录 前言 链接 参考 笔录草稿 移植(2018) 移植获取 (Cortex-M 内核) 主要文件夹分析 移植过程 1. 拷贝文件 2. 创建工程分组 3. 添加头文件路径 4. 兼容 C99 模式 ...

  6. 通俗易懂,android是如何管理内存的

    封面来源:https://medium.com/android-news/android-performance-patterns-rescue-tips-8c1e4c7cb1f0 前言 很高兴遇见你 ...

  7. 【JVM进阶之路】七:垃圾收集器盘点

    在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法.接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的 ...

  8. java例题_46 两个字符串拼接问题!

    1 /*46 [程序 46 字符串连接] 2 题目:两个字符串连接程序,将两个字符串拼接在一起 3 */ 4 5 /*分析 6 * 两个字符串的拼接方法 7 * concat方式 8 * 当两个量都为 ...

  9. [Azure Devops] 使用 Azure Repos 管理代码

    1. 什么是 Azure Repos Azure Repos 是一组版本控制工具,可用于管理代码.无论您的软件项目是大型项目还是小型项目,都应尽快使用版本控制. 版本控制系统是可帮助您跟踪随时间变化对 ...

  10. 第7 章 : 应用编排与管理:Job & DaemonSet

    应用编排与管理:Job & DaemonSet 本节课程要点 Job & CronJobs 基础操作与概念解析: DaemonSet 基础操作与概念解析. Job 需求来源 Job 背 ...