easyX绘图设备相关函数(注释版)

news2024/9/20 0:49:22

0.前言

这里是limou3434的easyX博文系列,感兴趣可以看看我的其他内容。

本次我给您带来的是easyX的绘图设备相关函数,和上一篇一样,对于官方文档我给了一些自认为重要的注释和测试例子,来辅助您理解这些函数。

1.easyX库函数分类

  1. 绘图设备相关函数
  2. 颜色模型
  3. 颜色及样式设置相关函数
  4. 绘制图形相关函数
  5. 文字输出相关函数
  6. 图像处理相关函数
  7. 消息处理相关函数
  8. 其它函数
  9. graphics.h 暂留函数

2.绘图设备相关函数

函数或数据类型描述
initgraph初始化绘图窗口
closegraph关闭图形窗口
cleardevice清除屏幕内容
setaspectratio设置当前缩放因子
getaspectratio获取当前缩放因子
setorigin设置坐标原点
graphdefaults恢复绘图窗口为默认值
setcliprgn设置当前绘图设备的裁剪区
clearcliprgn清除裁剪区的屏幕内容

3.initgraph:初始化绘画窗口

在默认情况下,easyX库在绘画窗口处进行绘画。而initgraph()负责初始化这个绘画窗口的高度、宽度、样式。

在后续的绘画中,严格与该函数的参数width和height强相关,这样可以避免修改绘图窗口大小时,其他绘画元素无法适应绘画窗口的问题。

HWND initgraph(
	int width,
	int height,
	int flag = NULL//这里实际上使用了C++的缺省值,是C++的一种用法,C语言不支持这个功能
);
//参数
//width:绘图窗口的宽度。
//height:绘图窗口的高度。
//flag:绘图窗口的样式,默认为 NULL。可为以下值:
//EX_DBLCLKS(在绘图窗口中支持鼠标双击事件)
//EX_NOCLOSE(禁用绘图窗口的关闭按钮)
//EX_NOMINIMIZE(禁用绘图窗口的最小化按钮)
//EX_SHOWCONSOLE(显示控制台窗口)
//若是想连续使用多个值,可以使用“|”连接这些值

//返回值
//返回新建绘图窗口的句柄。

这里的控制台实际上指的C语言在Windows环境下使用编译器运行代码时出现的字符命令行,即所谓“黑框框”。

而其中,句柄(handle)是一种标识对象的引用,通常是一个整数值或指针。它可以用来表示程序所创建的一些资源或对象,例如窗口、文件、设备上下文等等。通过使用句柄,程序可以轻松地访问、控制和管理这些资源或对象。具体来说,句柄可以看作是一种简单的数据结构,其中包含了对某个对象或资源的引用信息。使用句柄,程序可以避免直接访问对象或资源本身,从而提高了程序的安全性和可维护性。

#include <graphics.h>
#include <cstdio>
int main()
{
	initgraph(640, 480, EX_SHOWCONSOLE | EX_NOCLOSE);
	getchar();//如果不加上这个阻塞程序继续运行,则有可能出现“绘画窗口”一闪而过的情况
	return 0;
}

在这里插入图片描述

4.closegraph:关闭绘图窗口。

这个函数还是比较简单的,就是把之前打开的绘画窗口关闭,这个函数没有参数和返回值。这个函数一般在整个绘画程序结束后的结尾使用。initgraph()和closegraph()之前的关系和使用,有点类似C语言中的malloc()和free(),或者是fopen()和close()之间的关系。

void closegraph();

5.cleardevice:使用背景色清除绘图窗口

需要注意的是,需要提前设置好背景颜色,再使用这个函数清空绘图设备。关于设置背景颜色,我们下次再说。同样的,这个函数没有参数和返回值。

void cleardevice();

6.setaspectratio:设置当前缩放因子

这里就要重新提到之前的坐标轴概念了,easyX库里,物理坐标是没有办法改变缩放比例的。但是可以通过setaspectratio()来调整逻辑坐标的缩放比例。

在默认情况下,没有经过setaspectratio()调整的逻辑坐标和物理坐标的原点、坐标轴方向、缩放比例是一样的。

通过控制缩放因子,就可以实现x轴,y轴的缩放,甚至改变方向。利用调整后的逻辑坐标,我们就可以基于这个逻辑坐标,在上面进行定点的绘画。

另外这其实就是数学里“坐标轴缩放”。

void setaspectratio(
	float xasp,
	float yasp
);
//参数
//xasp:x方向上的缩放因子。例如绘制宽度为100的矩形,实际的绘制宽度为“100*xasp”
//yasp:y方向上的缩放因子。例如绘制高度为100的矩形,实际的绘制高度为“100*yasp”

//返回值
//无

//备注
//如果缩放因子为负,可以实现坐标轴的翻转。例如,执行setaspectratio(1, -1) 后,可使y轴向上为正。

7.getaspectratio:获取当前缩放因子

这个函数也没什么好讲的,就是传入两个float类型的变量,经过这个函数得到当前逻辑坐标的缩放因子值,该函数没有返回值。

void getaspectratio( 
	float *pxasp, 
	float *pyasp 
);

8.setorigin:设置坐标原点

只改变缩放因子还不够,有时候我们需要设置逻辑坐标的坐标原点,更加方便我们绘画。值得注意的是,逻辑坐标的新原点需要通过物理坐标来确定。

void setorigin(int x, int y);
//参数
//x:原点的 x 坐标(使用物理坐标)
//y:原点的 y 坐标(使用物理坐标)

//返回值
//无

9.graphdefaults:恢复绘图窗口为默认值

把当前的绘画窗口重置默认值。重置视图、当前点、绘图色、背景色、线形、填充样式、字体为默认值。该函数没有参数,也没有返回值。

void graphdefaults();

10.setcliprgn:设置当前绘图设备的裁剪区

这个函数用于设置当前绘图设备的裁剪区。

void setcliprgn(HRGN hrgn);
//参数
//hrgn:区域的句柄。创建区域所使用的坐标为物理坐标。如果该值为NULL,表示取消之前设置的裁剪区。

//返回值
//无

其中HRGN是Windows定义的表示区域的句柄。将该区域设置为裁剪区后,任何区域外的绘图都将无效(但仍然可以通过操作显示缓冲区在裁剪区外绘图)。可以使用Windows GDI函数创建一个区域。例如,创建矩形区域可以使用函数:“HRGN CreateRectRgn(int left, int top, int right, int bottom);”

此外,还可以使用函数CreateEllipticRgn()创建椭圆形的区域,使用CreatePolygonRgn()创建多边形的区域等等。还可以使用CombineRgn组合区域。更多关于区域的GDI函数,请参考MSDN中的 Region Functions。(这部分easyX的画图函数,后面会再次提及)

创建区域后,如果不再使用,请执行DeleteObject()以释放该区域对应的系统资源。下面是setcliprgn()的使用例子。

#include <graphics.h>
#include <conio.h>

int main()
{
	// 初始化绘图窗口
	initgraph(640, 480);
	// 创建一个矩形区域
	HRGN rgn = CreateRectRgn(100, 100, 200, 200);
	// 将该矩形区域设置为裁剪区
	setcliprgn(rgn);
	// 不再使用 rgn,清理 rgn 占用的系统资源
	DeleteObject(rgn);
	// 画圆,受裁剪区影响,只显示出四段圆弧
	circle(150, 150, 55);
	// 取消之前设置的裁剪区
	setcliprgn(NULL);
	// 画圆,不再受裁剪区影响,显示出一个完整的圆
	circle(150, 150, 60);
	// 按任意键退出
	_getch();
	closegraph();
}

在这里插入图片描述

11.clearcliprgn:清除裁剪区的屏幕内容

这个函数也比较简单,在上一个例子中试着使用一下这个函数看看(同样这里的画圆函数我们以后还会再次提及)

#include <graphics.h>
#include <conio.h>

int main()
{
	// 初始化绘图窗口
	initgraph(640, 480);
	// 画圆,能显示所有的圆弧
	circle(150, 150, 100);
	// 按任意键下一步
	_getch();

	// 创建一个矩形区域
	HRGN rgn = CreateRectRgn(100, 100, 200, 200);
	// 将该矩形区域设置为裁剪区
	setcliprgn(rgn);
	// 不再使用 rgn,清理 rgn 占用的系统资源
	DeleteObject(rgn);
	// 画圆,受裁剪区影响,只显示出四段圆弧
	circle(150, 150, 55);
	// 按任意键下一步
	_getch();

	// 清空裁剪区内容
	clearcliprgn();
	// 按任意键下一步
	_getch();

	// 画圆,受裁剪区影响,但是还是能显示所有的圆弧
	circle(150, 150, 20);
	// 按任意键下一步
	_getch();

	// 清空裁剪区内容
	clearcliprgn();
	// 按任意键下一步
	_getch();

	// 画圆,受裁剪区影响,但是还是能显示所有的圆弧
	circle(150, 150, 20);
	// 取消裁剪区
	setcliprgn(NULL);
	// 按任意键下一步
	_getch();

	// 画圆,不受裁剪区影响,显示所有的圆弧
	circle(150, 150, 110);
	// 按任意键下一步
	_getch();

	// 用背景色清空所有内容
	cleardevice();
	// 按任意键下一步
	_getch();

	closegraph();
}

调试观察上面图形变化的过程,就可以理解这个函数的使用了。

12.总结

本次的所讲解的函数,大部分都是在使用easyX库进行绘图之前的一些预备工作,并不算难,但是是后面绘图的基础。

下次我会将“颜色模型”结合“颜色及样式设置相关函数”进行讲解。

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

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

相关文章

【汤4操作系统】深入掌握操作系统-文件管理篇

第六章 文件管理 文件 数据项&记录&文件 数据项分为&#xff1a; 基本数据项&#xff1a;描述对象的某些属性&#xff0c;例如学生的年龄&#xff0c;姓名学号等组合数据项&#xff1a;由若干个基本数据项组合而成 记录&#xff1a;一组相关数据项的集合&#xff0…

光线追踪中的空间划分,辐射度量学简介

之前接触过四岔树&#xff0c;这里用到了KD-tree和BSP-Tree KD-Tree 对于如何划分&#xff1a; 首先需要知道需要沿着哪一条轴进行划分&#xff0c;划分的位置所有节点不存在父节点上&#xff0c;只存在于叶节点上 对于如何查找 光线穿过包围盒A&#xff0c;那么分别对其两…

4.4 超简单文书编辑器:nano

在Linux系统当中有非常多的文书编辑器存在&#xff0c;其中最重要的是vim。 nano使用很简单&#xff0c;可以直接加上文件名就能够打开一个旧文件或新文件。打开一个叫text.txt的文件名来看看&#xff1a; [ctrl]-G&#xff1a;取得线上说明&#xff08;help&#xff09;&…

Python案例——采集专栏文章保存成pdf

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 wkhtmltopdf 软件 找助理邀课老师获取 模块使用: 内置模块 re >>>正则表达式 第三方模…

es6 的模块化由来

es 模块化&#xff0c;之前是没有的。没有的时候&#xff0c;用的是社区创建的commjs模块化 commjs模块其实是一个对象&#xff0c;这个对象要在代码运行的时候才会创建出来的 这有个不好的地方&#xff0c;就是不能在编译的时候找到依赖文件&#xff0c;也不能进行类型检查&…

一文搞定C++异常机制(附代码+详细解析)

C异常 1.引文C语言传统的处理错误的方式&#xff1a; 2.C异常概念3.异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出异常捕获中的内存泄漏问题 3.3异常安全3.4异常规范 4.异常优缺点5.总结&#xff1a; 1.引文 C语言传统的处理错误的方式&#xff1a; 终止程序&#xff0c…

【GAI】红杉美国生成式AI:一个创造性的新世界

The New Language Model Stack 红杉美国官网发表了最新一篇题为《Generative AI: A Creative New World》的文章译稿&#xff0c;&#xff0c;原文作者是红杉的两位合伙人&#xff1a;Sonya Huang和Pat Grady&#xff0c;有意思的是在文章作者一栏&#xff0c;赫然还写着GPT-3…

华为OD机试真题 JavaScript 实现【磁盘容量排序】【2022Q4 100分】,附详细解题思路

一、题目描述 磁盘的容量单位常用的有M&#xff0c;G&#xff0c;T这三个等级&#xff0c;它们之间的换算关系为1T 1024G&#xff0c;1G 1024M&#xff0c;现在给定n块磁盘的容量&#xff0c; 请对它们按从小到大的顺序进行稳定排序&#xff0c;例如给定5块盘的容量&#x…

宠物电商社区APP的设计与实现

摘 要&#xff1a;为了设计并实现具有宠物产品商城和问答社区功能的APP&#xff0c;通过比较国内外宠物行业电商发展现状和国内已有的宠物电商平台的优缺点&#xff0c;分析可行性和需求&#xff0c;从而进行详细设计和实现。该APP后台采用SSM框架&#xff0c;数据库使用MySQL…

最终版:1分钟自动部署数字人平台并提供web服务:唇形合成(wav2lip) + 超分修复(codeformer),

Demo效果 本文实现步骤:数字人形象(AI绘画) -> 文字转语音(谷歌tts) -> 表情迁移 -> 唇形合成 -> 视频超分 上述步骤所有技术均已在此专栏发布,可点击上方专栏查看具体博文 所有技术依赖环境及api接口均封装打包完毕,使用docker一键部署,预计耗时10分钟 原图 …

tolua源码分析(八)lua扩展继承C#类

tolua源码分析&#xff08;八&#xff09;lua扩展继承C#类 上一节我们阐述了lua调用带out参数的C#函数机制&#xff0c;本节我们来看下lua层是如何扩展C#类的。这次的例子在example 17&#xff0c;主要都是lua代码&#xff1a; LuaTransform { } …

1.pixi.js编写的塔防游戏(类似保卫萝卜)-设计逻辑

游戏说明 一个用pixi.js编写的h5塔防游戏&#xff0c;可以用electron打包为exe&#xff0c;支持移动端&#xff0c;也可以用webview控件打包为app在移动端使用 环境说明 cnpm6.2.0 npm6.14.13 node12.22.7 npminstall3.28.0 yarn1.22.10 npm config list electron_mirr…

1.2 聚合工程与springboot整合

步骤1&#xff1a; 在顶级父工程中添加springboot相关的pom配置 <!--springboot父级依赖&#xff0c;表示是一个是springboot项目 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifa…

vue3(基于vite)项目初始基本配置

简介 一个好的项目开始搭建总是需要配置许多初始化配置&#xff0c;比如eslint语法检验、prettier代码格式统一、husky做commit拦截等等&#xff0c;本文从零开始带你一步步搭建一个完整的项目配置&#xff0c;熟悉之后下次直接拿来即用 环境准备 node v16以上pnpm 8.0.0 1.新…

4.3.3 info page

在所有的Unix Like系统当中&#xff0c;都可以利用 man 来查询指令或者是相关文件的用法&#xff1b; 但是&#xff0c;在Linux里面则又额外提供了一种线上求助的方法&#xff0c;那就是利用info。 基本上&#xff0c;info与man的用途其实差不多&#xff0c;都是用来查询指令的…

看完就会,从抓包到接口测试的全过程解析!

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段&#xff0c;这些隐藏字段一般都有一些特殊的用途&#xff0c;比如收集用户的数据&#xff0c;预防 CRSF 攻击&#xff0c;防网络爬虫&#xff0c;以及一些其他用途。这些隐藏字段在界面…

数据库大题

(计算题&#xff0c;20分) 设有两个关系R和S,求① R ∪ S R \cup S R∪S;② R − S R - S R−S;③ R S R \times S RS;④ ∏ C , A ( R ) \prod_{C,A}(R) ∏C,A​(R);⑤ σ B > ′ 4 ′ ( R ) \sigma_{B>4}(R) σB>′4′​(R) 关系R关系S (简答题&#xff0c;10…

Telnet是什么协议?如何使用?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 ​编辑 一、Telnet是什么协议&#xff1f; 二、Telnet用在哪&#xff1f; 三、Telnet协议的优点和缺点 ​编辑 1、优点 ①简单易…

Microservice架构模式简介

在2014年&#xff0c;Sam Newman&#xff0c;Martin Fowler在ThoughtWorks的一位同事&#xff0c;出版了一本新书《Building Microservices》。该书描述了如何按照Microservice架构模式设计及搭建一个具有良好扩展性并可持续开发的系统。除此之外&#xff0c;该书还将基于该模式…

pygame光栅化三角形 用像素填充三角形

参考文章 DirectX C 3D编程基础 5 [三角形光栅化] 自制中字 这次用像素填充三角形&#xff0c;是为了下次用图片做纹理填充三角形做准备。 前面的文章说了根据直线方程求出已知两点间任意一点的坐标&#xff0c;现在来试试用像素填充三角形。 首先画一个三角形 pygame.draw.…