跳到主要内容

基本结构

尽管 HiEasyX 以灵活性为优点。你几乎可以不受任何限制地在你的 EasyX 程序中随意使用。但是我们依然建议你养成一个良好的习惯,形成一定的程序架构。再次会看配置最后我们使用的测试代码:

#include <include/hex.h>
#include <include/impl/EasyX/hex_impl_easyx.h>

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

BeginBatchDraw();

HX::HXInitForEasyX();
HX::SetBuffer(GetWorkingImage());

setbkcolor(RGB(180, 180, 180));

HX::WindowProfile windowProfile;
while (true) {
cleardevice();

HX::HXBegin();

ExMessage message{};
while (peekmessage(&message)) {
HX::PushMessage(HX::GetHXMessage(&message));
}

HX::Window(HXStr("Hello World!"), windowProfile);
HX::Text(HXStr("Hello HiEasyX!"));

static int count = 0;
static HX::ButtonProfile buttonProfile;
HX::BeginSameLine();
if (HX::Button(HXStr("Hello Button"), buttonProfile)) {
++count;
}
HX::Text(HXStr("Count : ") + ToHXString(count));
HX::EndSameLine();

HX::End();
HX::Render();

FlushBatchDraw();

Sleep(1);
}

return 0;
}

这个代码很好地示范了我们推荐的 HiEasyX 的代码结构。我们先不管代码中的 HX::WindowProfile 这种东西是什么意思,先来审阅一下这个代码的结构。

该代码首先初始化了 EasyX 以及 HiEasyX(我们先不管是怎么初始化的),然后进入了一个死循环,这个死循环我们称之为渲染循环,你可以简单地理解为该循环内的代码都是用于绘图的。而渲染循环中的函数 HX::Render 就是 HiEasyX 对自身自建渲染的封装,调用该函数意味着 HiEasyX 要开始进行绘图操作了。关于 HX::Render 这个函数,我们会在后面的文章中继续介绍,此处只是简单提及。

接下来程序进入了第二个循环:

while (peekmessage(&message)) {
HX::PushMessage(HX::GetHXMessage(&message));
}

一个最简单理解这个循环的作用的方式就是:把这个循环的代码先删掉再运行程序。如果你真的这么做了的话你就会发现:当你再次尝试拖动和缩放窗口时,程序不会再有反应。凭直觉能感觉到这个循环是用来处理用户和程序的交互的,我们称作消息循环。那么 HX::PushMessage 函数的作用就很明显了,将信息提供给 HiEasyX,而 HX::GetHXMessage 则负责把消息转化为 HiEasyX 能够识别的格式。

有了这两个循环就可以构成一个比较规范的应用程序结构了。

顺带一提,你能使用到的几乎所有 HiEasyX 接口都是位于 HX 命名空间下的。

提示

当然如果你是一个很娴熟的开发者的话,这里我们要做提醒的是 HiEasyX 并不需要严格按照上述结构书写。如果你知道你在做什么的话,你可以选择不按照上面的结果那么写。只要你能够正确处理消息传递和渲染逻辑即可。