MFC绘制二维图形【1】—— 使用映射模式函数自定义坐标系

news2024/12/25 23:53:27

目录

一、创建Test工程

二、自定义坐标系

三、映射模式(MapMode) 

四、映射模式函数

1)设置映射模式函数

2)设置窗口范围函数

3)设置视区范围函数

4)设置视区原点函数

5)偏移矩形函数

五、 不改变映射模式修改坐标系


一、创建Test工程

1、新建单文档项目

2、绘制二维图像实在CTestView类中的OnDraw函数,OnDraw函数中被注释的指针PDc要放开(纯虚函数)

3、在MFC框架中,窗口显示的是像素,屏幕以像素为基准。


二、自定义坐标系


三、映射模式(MapMode) 

模式代码宏定义值坐标系特征
MM_TEXT1每个逻辑单位被转换为1个设备像素,正x向右,正y向下
MM_LOMETRIC2每个逻辑单位被转换为0.1毫米,正x向右,正y向上
MM_HIMETRIC3每个逻辑单位被转换为0.01毫米,正x向右,正y向上
MM_LOENGLISH4每个逻辑单位被转换为0.01英寸,正x向右,正y向上
MM_HIENGLISH5每个逻辑单位被转换为0.001英寸,正x向右,正y向上
MM_TWIPS6每个逻辑单位被转换为1/20点(一点是1/72英寸,一个twip是1/1440英寸),正x向右,正y向上
MM_ISOTROPIC7在保证x轴和y轴比例相等的情况下,逻辑单位被转换为任意的单位,且方向可以独立设置
MM_ANISOTROPIC8逻辑单位被转换为任意的单位,x轴和y轴的方向和比例独立设置

四、映射模式函数

1)设置映射模式函数

        原型:virtual int SetMapMode(int nMapMode);

        参数:nMapMode用于指定新的映射模式,可常取MM_ANISOTROPIC。

        MM_ANISOTROPIC是窗口范围和设备范围可以任意改变,要求使用SetWindowExt函数设置窗口的范围,使用SetViewPortExt函数设置视区的范围。

2)设置窗口范围函数

        原型:virtual CSize SetWindowExt(int cx,int cy);

        参数:cx窗口x范围的逻辑单位,cy窗口y范围的逻辑单位;

3)设置视区范围函数

        原型:virtual CSize SetViewportExt(int cx,int cy);

        参数:cx视区x范围的设备单位,cy视区y范围的设备单位;

4)设置视区原点函数

        原型“:virtual CPoint SetViewportOrg(int x,int y);

        参数:x,y是视区新原点的设备坐标;

5)偏移矩形函数

        原型:void OffsetRect(int x,int y);

        参数:x左右偏移量,y上下偏移量;


	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;	//定义一个矩形对象
	GetClientRect(rect);//初始化(rect不是一个数值,很多属性)
	//使用映射模式函数
	pDC->SetMapMode(8);
	//设置窗口的大小
	pDC->SetWindowExt(rect.Width(),rect.Height());//矩形的宽高作为窗口大小
	//设置视区大小
	pDC->SetViewportExt(rect.Width(),-rect.Height());
	//圆点
	pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
	//此时矩形位置随坐标系变化,应该是在右上角,需要进行平移
	rect.OffsetRect(-rect.Width() / 2,-rect.Height() / 2);

	//绘制一个三角形
	CPoint P0(-200, -100), P1(200, -100), P2(0,200);
	pDC->MoveTo(P0);
	pDC->LineTo(P1);
	pDC->LineTo(P2);
	pDC->LineTo(P0);


五、 不改变映射模式修改坐标系

    CRect rect;
    GetClientRect(&rect);
    int nClientWidth = rect.Width();
    int nClientHeight = rect.Height();
    int nHWidth = nClientWidth/2;
    int nHHeigh = nClientHeight/2;

	CPoint P0(-200, -100), P1(200, -100), P2(0,200);
	pDC->MoveTo(nHWidth + P0.x,nHHeight - P0.y);
	pDC->LineTo(nHWidth + P1.x,nHHeight - P1.y);
	pDC->LineTo(nHWidth + P2.x,nHHeight - P2.y);
	pDC->LineTo(nHWidth + P0.x,nHHeight - P0.y);

通过比较可知,第一种更方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyTinySTL学习笔记:迭代器iterator(一)

前言 本系列文章所学习的Github上基于C11的开源项目MyTinySTL,项目地址为:(https://github.com/Alinshans/MyTinySTL),感谢Alinshans大佬开源这个优质的学习项目。 一、什么是迭代器 无论是序列容器还是关联容器,最…

useWindowPrint 自定义的打印HOOK

useWindowPrint 自定义的打印HOOK 1 介绍 useWindowPrint 用于实现页面的打印,打印的效果相对来说比较好。useWindowPrint 支持 onBeforePrint、onBeforePrintContent、onAfterPrint 等回调,可以很方便地在不同阶段进行操作,如果觉得使用回…

基于PHP+MySQL蛋糕甜点销售网站的设计与开发

现如今先进科学技术高速发展,计算机技术已经被社会的各个领域广泛应用。随着计算机技术和通信技术的迅猛发展,互联网的规模也逐步增大,互联网的元素也随之逐渐增加,可以利用其发展通信,也可以利用其进行商业用途&#…

scratch小老鼠偷面包 电子学会图形化编程scratch等级考试二级真题和答案解析2022年9月

目录 scratch小老鼠偷面包 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <

Vue Class与Style绑定

Vue Class与Style绑定1 Class绑定1.1 字符串写法1.2 数组写法1.3 对象写法2 Style绑定2.1 对象写法2.2 数组写法1 Class绑定 在Vue中&#xff0c;如果要为某个元素动态添加某个类&#xff0c;并不会使用document.getElementById等选择器将该元素获得&#xff0c;而是使用v-bin…

Tomcat突然停止运行/Server Tomcat v8.5 Server at localhost fail

Server Tomcat v8.5 Server at localhost failed to start./org.apache.catalina.startup.Catalina start 严重: 所必需的服务组件启动失败&#xff0c;所以无法启动Tomcat 1.使用eclipse写系统时突然无法运行jsp文件 2.查看任务管理器&#xff0c;将其启动&#xff0c;依旧不…

101-115-hive-优化执行计划表优化

101-压缩存储-优化&#xff1a; 执行计划&#xff08;Explain&#xff09; 1&#xff09;基本语法 EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION] query &#xff08;2&#xff09;查看详细执行计划 hive (default)> explain extended select * from emp; hive (de…

OpenGL 图像绿幕抠图

目录 一.OpenGL 图像绿幕抠图 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 图像绿幕抠图 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL E…

Linux 内核(Kernel)组成分析

【好文推荐】 需要多久才能看完linux内核源码&#xff1f; 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 一文了解Linux上TCP的几个内核参数调优 概述Linux内核驱动之GPIO子系统API接口 一、Linux内核简介 Linux 内核采用宏内核架构&#xff0c;即 Linux …

Springboot利用Security做OAuth2授权验证

OAuth2获取授权令牌&#xff08;token&#xff09;通常有四种方式&#xff1a;授权码模式&#xff0c;简化模式&#xff0c;客户端模式&#xff0c;和密码模式。针对自己系统内用户的登录&#xff0c;通常使用密码模式进行授权。 我们利用Spring Security OAuth2来制作一个授权…

[附源码]Python计算机毕业设计Django健身生活系统论文

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Java】从源码分析fail-fast和fail-safe是如何产生的

文章目录fail-fastfail-safe这个问题出现在使用Iterator迭代器的时候。如果某一个集合在使用的时候&#xff0c;另一个线程修改了这个集合&#xff0c;会出现什么情况呢&#xff1f;因此就出现了两种解决策略fail-fast 一旦发现遍历的同时其它人来修改&#xff0c;则立刻抛异常…

【微信小程序】页面跳转、组件自定义、获取页面参数值

&#x1f3c6;今日学习目标&#xff1a;第十七期——页面跳转、组件自定义、获取页面参数值 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;25分钟 &#x1f389;专栏系列&#xff1a;我的第一个微信小程序 文章目…

推荐系统相关论文阅读整理

文章题目 基于协同过滤的微信点餐推荐系统的设计与实现 作者 张彭飞 吉林大学 期刊论文在线阅读—中国知网 (cnki.net)摘要关键词协同过滤;推荐系统;Docker;PXC;RedisCluster;名词解释文献研究目的推荐系统应用现状 在1990 年代&#xff0c;为了解决邮件过载问题&#xff0c…

如此简单的k8s,快速玩转ingress

如此简单的k8s&#xff0c;快速玩转ingress NodePort 可以实现的功能和缺陷&#xff1a; 功能、在每一个节点上面都会启动一个端口&#xff0c;在访问的时候通过任何的节点&#xff0c;通过节点加ip的形式实现访问 缺点、也就是说每个端口只能使用一次&#xff0c;一个端口对应…

传输层协议 —— TCP(图解1)

目录 一、TCP的基本认识 1. TCP头部格式 2. TCP协议的特点 3. 什么是TCP连接 4. TCP如何封装与分用 二、通过序列号和确认应答号提高可靠性 1. 32位序列号 2. 32位确认应答号 3. 保证可靠性 4. 为什么序列号和确认应答号是单独的字段 三、窗口大小 1. TCP的发送和…

[附源码]JAVA毕业设计敬老院管理系统(系统+LW)

[附源码]JAVA毕业设计敬老院管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

ubuntu 实现远程开关机

1. 需求 家里厅里有三台linux主机在跑虚拟机, 一台windows主机在跑wsl2 - ubuntu 20.04 分别是 硬件网络连接方式OSip虚拟机sEUC i5 7250U 16Gwifiwin1010.0.1.223wsl2 - 随机ipMineFine S500 R7 5800H 64G网线Zorin OS 16.2 (Ubuntu 20.04 LTS)10.0.1.198vm1 - 10.0.1.156 …

统计信号处理基础 习题解答6-14

题目&#xff1a; 噪声过程由IID零均值&#xff0c;PDF为 的随机变量组成&#xff0c;其中0<ε<1 。这样的PDF成为高斯混合PDF&#xff0c;它用来模拟 具有方差为 的高斯噪声以及剩余的服从方差 的高斯噪声。一般 &#xff0c;且ε≪1 &#xff0c;所以具有方差为 的背…

[Java安全]—Tomcat反序列化注入回显内存马

前言 在之前学的tomcat filter、listener、servlet等内存马中&#xff0c;其实并不算真正意义上的内存马&#xff0c;因为Web服务器在编译jsp文件时生成了对应的class文件&#xff0c;因此进行了文件落地。 所以本篇主要是针对于反序列化进行内存马注入来达到无文件落地的目的…