HiEasyX/Tutorial/draw_tns.md
2023-01-13 17:10:47 +08:00

2.6 KiB
Raw Permalink Blame History

回到教程目录

使用基础 EasyX 函数绘制透明图形

前面已经说过,可以使用 HiEasyX 内封装的 GDI+ 接口绘制透明和抗锯齿图形,详见 这里

此外,也可以使用基础 EasyX 函数实现绘制透明图形。

这里说一句,我所指的“基础 EasyX 函数”包括封装在 Canvas 内的 EasyX 原生函数,以及原生 EasyX 函数。

如下代码所示:

#include "HiEasyX.h"

int main()
{
	initgraph(640, 480);

	hiex::Canvas canvas;
	hiex::BindWindowCanvas(&canvas);

	canvas.CenterText(L"Wonderful");

	// 由于 canvas 绑定了窗口,所以由外部向 canvas 上绘图前,要先启动窗口任务,
	// 此处使用 BeginBatchDrawing 是因为它会在内部启动窗口任务。
	canvas.BeginBatchDrawing();

	// 绘制透明图形
	DRAW_TNS_INIT_GRAPHICS(201, 201);
	{
		graphics.FillCircle(100, 100, 100, true, RED, SKYBLUE);
	}
	DRAW_TNS_RENDER_TO(120, 120, canvas.Pt(), 100);
	
	// 对应 BeginBatchDrawing
	canvas.EndBatchDrawing();

	REDRAW_WINDOW();
	getmessage(EM_CHAR);
	closegraph();
	return 0;
}

分析上述代码:

  1. 首先准备绘制透明图形指定透明图形的宽高201 * 201
DRAW_TNS_INIT_GRAPHICS(201, 201);
  1. 然后在一个代码块中使用 graphics 变量绘图
{
	graphics.FillCircle(100, 100, 100, true, RED, SKYBLUE);
}

注意,不打花括弧也可以编译,但是最好还是打上,因为宏定义展开 DRAW_TNS_INIT_GRAPHICSDRAW_TNS_RENDER_TO 他俩之间就是有花括弧的,这里也打上,以免不知道这中间是代码块。

此外,关于变量 graphics,这是在 DRAW_TNS_INIT_GRAPHICS 宏里面定义的,就是用来给你绘制透明图形的。你也无需担心这个变量和代码块外的变量产生命名冲突,因为代码块内外的变量是可以重名的。

还有,在这个代码块内也可以不使用 graphics 变量进行绘制,你可以直接就用原生 EasyX 函数画图就行了,像这样:

DRAW_TNS_INIT_GRAPHICS(201, 201);
{
	setfillcolor(GREEN);
	fillcircle(100, 100, 100);
}
DRAW_TNS_RENDER_TO(120, 120, canvas.Pt(), 100);

其实就相当于在这个代码块内WorkingImage 被临时设置到了变量 graphics 上,一出代码块就设置回来了。所以注意在代码块内的坐标系是 graphics 的坐标系。

  1. 最后设定你所绘制的透明图形要输出到什么地方,以及透明度是多少
DRAW_TNS_RENDER_TO(
	120,			// 输出坐标 X
	120,			// 输出坐标 Y
	canvas.Pt(),	// 输出到哪个 IMAGE*
	100				// 透明度0~255
);

回到教程目录