跳转至

使用基础 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)
);

评论