窗口和视口

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

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

一般映射模式

如果将映射模式改为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. filecoin今日价格,filecoin币价估值,filecoin币会涨到多少钱

    filecoin今日价格,截止 2021 年 3 月 17 日 9 时,filecoin价格为 63.8939 美元,约合人民币 415.69 元.流通市值约 416.2 亿人民币,总市值达到 831 ...

  2. c/c++ switch case内括号

    如果在case语句中有定义变量,则必须要加{},否则会报错.

  3. Mybatis日志源码探究

    一.项目搭建 1.pom.xml <dependencies> <dependency> <groupId>log4j</groupId> <ar ...

  4. golang 性能优化分析:benchmark 结合 pprof

    前面 2 篇 golang 性能优化分析系列文章: golang 性能优化分析工具 pprof (上) golang 性能优化分析工具 pprof (下) 一.基准测试 benchmark 简介 在 ...

  5. vue 快速入门 系列 —— 侦测数据的变化 - [基本实现]

    其他章节请看: vue 快速入门 系列 侦测数据的变化 - [基本实现] 在 初步认识 vue 这篇文章的 hello-world 示例中,我们通过修改数据(app.seen = false),页面中 ...

  6. 【剑指offer】10:矩形覆盖

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路: ①方法一 对于这种题没有思路怎么办?可以先从最 ...

  7. Bounding Volume Hierarchies 加速结构

    背景   光线与物体求交是光线追踪的主要时间瓶颈.   如果不进行优化,则对每条光线,我们都需要遍历场景中的全部物体并求交.而现在想建模一个小物体的表面,往往要几千甚至几万个三角形,一个商业级产品,屏 ...

  8. 什么是JWT?原理是什么?

    什么是JWT JWT 是Json Web Tokens的简称.用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的.用于在网络上声明某种主张的令牌(token). JTW原理 jwt验 ...

  9. python 爬取王者荣耀英雄皮肤代码

    import os, time, requests, json, re, sys from retrying import retry from urllib import parse "& ...

  10. 5403. Find the Kth Smallest Sum of a Matrix With Sorted Rows

    You are given an m * n matrix, mat, and an integer k, which has its rows sorted in non-decreasing or ...