窗口和视口

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

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

一般映射模式

如果将映射模式改为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. solr简明教程

    文章目录 安装 启动 创建core 配置core索引MySQL数据 3.2.1 3.2.2 3.2.3 测试定时更新 五.配置中文分词 SolrJ 操作索引的增.删.查 七.通过SolrJ对MySQL ...

  2. python graphviz的使用(画图工具)

    参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...

  3. java例题_42 求满足809*??=800*??+9*??+1的??的值

    1 /*42 [程序 42 求数字] 2 题目:809*??=800*??+9*??+1 3 其中??代表的两位数,8*??的结果为两位数,9*??的结果为 3 位数.求??代表的两位数,及 809* ...

  4. 去空格的四则运算表达式求值-Java

    笔记 package com.daidai.day4.demo1; import java.util.ArrayList; import java.util.Arrays; import java.u ...

  5. PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642

    PAT (Advanced Level) Practice 1002 A+B for Polynomials (25 分) 凌宸1642 题目描述: This time, you are suppos ...

  6. VisualGDB_VS2010_开发PHP扩展

    1.新建一个Linux项目

  7. 设计原则:单一职责(SRP)原则

    1 什么是单一职责(SRP)原则 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP.翻译过来就是:一个类或者模块只负责完成一个职责(或者功能). 所 ...

  8. 带你全面认识CMMI V2.0(终)——实施落地

    引入CMMI的方法 一共有四个阶段将您的业务过程和最佳实践最终融合在一起,并在该范围内重新创造整个组织的"完成方式".这四个阶段是: 战略探索:此阶段的重点是了解当前状态并计划过渡 ...

  9. 在Visual Studio 中使用git——什么是Git(一)

    写程序必然需要版本控制,哪怕是个人项目也是必须的,微软从Visual Studio 2019开始默认提供了对Git的支持,Visual Studio 2019之前的版本可以安装相应的插件来实现Git功 ...

  10. 前后端分离中的无痛刷新token机制

    今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...