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

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

easyX绘图设备相关函数(注释版)_第1张图片

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 
#include 

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();
}

easyX绘图设备相关函数(注释版)_第2张图片

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

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

#include 
#include 

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库进行绘图之前的一些预备工作,并不算难,但是是后面绘图的基础。

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

你可能感兴趣的:(python,java,windows)