GDI编程基础
窗口和视口
视口是基于设备的采用的是设备坐标(单位:像素),窗口是基于程序的采用的是逻辑坐标(单位:像素/毫米/厘米等)。
在默认的映射模式下,视口是与窗口等同的。但是如果改变其映射模式,则其对应的单位则不相同。
一般映射模式
如果将映射模式改为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编程基础的更多相关文章
- GDI 编程基础简介
今天准备重新对GDI的知识进行回顾一下,以便加深认识. 一.GDI 在进行Windows编程时,可能经常会用到设备描述表的类型句柄,例如,最厂家的HDC,它就是图像设备描述类型句柄.因为GDI的绘图函 ...
- C#GDI+编程基础(一:Graphics画布类)
GDI+存在的意义:将变成与具体硬件实现细节分开. GDI+步骤:获取画布,绘制图像.处理图像 命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using ...
- C#GDI+编程基础(二)
pen类:绘制指定宽度和样式的直线.使用DashStyle属性绘制几种虚线,可以使用各种填充样式(包括纯色和纹理)来填充Pen绘制的直线,填充模式取决于画笔或用作填充对象的纹理. 创建画笔: //用指 ...
- C#_GDI+详细教程(图形图像编程基础)
第7章 C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1 GDI+绘图基础 编写图形程序时需要使用GDI( ...
- GDI+(一):GDI+ 绘图基础
一.GDI+绘图基础 编写图形程序时需要使用GDI(Graphics Device Interface,图形设备接口),从程序设计的角度看,GDI包括两部分:一部分是GDI对象,另一部分是GDI函数. ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础
第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...
- 第二章 Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
- [.net 面向对象编程基础] (1) 开篇
[.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握 Broadcast 编程基础,实现动态注册 Broadcast 和静态注册 Broadcast 的方式以及学 ...
随机推荐
- css行高
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- Typora的MarkDown语法快捷键
Typora的MarkDown语法快捷键 1.标题 项目 快捷键一 快捷键二 一级标题 #+空格+文本+回车 Ctrl+1 二级标题 ##+空格+文本+回车 ctrl+2 三级-- ###-- ctr ...
- TCP/IP协议的经典面试知识点总结
前言 大家好啊,我是汤小圆. 今天给大家推荐的是,TCP/IP协议的经典面试知识点总结,希望对大家有帮助,谢谢. 简介 我们平时经常听到的TCP/IP协议,其实是一个协议族: 只不过因为TCP.IP是 ...
- 使用 Kubernetes 扩展专用游戏服务器
系列 探索使用 Kubernetes 扩展专用游戏服务器:第 1 部分-容器化和部署 探索使用 Kubernetes 扩展专用游戏服务器:第 2 部分-管理 CPU 和内存 探索使用 Kubernet ...
- java例题_22 用递归求阶乘 5!
1 /*22 [程序 22 递归求阶乘] 2 题目:利用递归方法求 5!. 3 程序分析:递归公式:fn!=fn*4! 4 */ 5 6 /*分析 7 * 递归:如果其中每一步都要用到前一步或前几步的 ...
- 谷歌SRE运维模式解读
谷歌SRE运维模式解读 前面我和你分享了一些关于运维组织架构和协作模式转型的内容,为了便于我们更加全面地了解先进的运维模式,今天我们再来谈一下谷歌的SRE(Site Reliability Engin ...
- 全网最详细的Linux命令系列-mkdir命令
Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: mkdir [选项] 目录... 命令功能: ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria单机
自动化kolla-ansible部署ubuntu20.04+openstack-victoria单机 欢迎加QQ群:1026880196 进行交流学习 一. 环境信息 1. 硬件信息 型号:Dell ...
- Day11_55_在Map集合中使用泛型
在Map集合中使用泛型 ``` import java.util.HashMap; import java.util.Iterator; import java.util.Map; import ja ...
- (数据科学学习手札118)Python+Dash快速web应用开发——特殊部件篇
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...