【StellarX v3.0.1】用 EasyX 封装出“可用、可教、可拓展”的 C++ GUI
很多学习 C++ 的同学在做 Windows 桌面大作业或小工具时,经常会陷入一个两难的境地:
- 直接用 Win32/MFC:流程太重、样板代码多,为了画个按钮要写一堆晦涩的底层代码。
- 上手 Qt 等大框架:功能确实强,但对于一个几百行的课设或轻量工具来说,安装体量太大、编译慢、学习曲线太陡。
- 仅用 EasyX:绘图极其简单好用,但它本质是个图形库,没有“按钮/文本框/表格/选项卡”这些现成的控件体系,想做应用 UI 只能自己从头造轮子。
为了填补这块空白,我基于大家熟悉的 EasyX 图形库,开发了这套极致轻量级、现代 C++ (C++17) 的原生 GUI 框架——StellarX (星垣)。
经历了半年的迭代与重构,StellarX 现已正式迈入 v3.0 时代!它不与 Qt 竞争“全家桶”,而是专心为 Windows 平台的小工具开发与 C++ 面向对象教学提供一个:足够好用、足够轻、代码足够清晰 的解决方案。
「繁星为界,轻若尘埃」
📌 项目主页与资源
GitHub 仓库:https://github.com/Ysm-04/StellarX (欢迎 Star ✨)
官方网站:https://stellarx-gui.top
教程与博客:https://blog.stellarx-gui.top
完善的文档体系:仓库内自带中英文双语 API 文档 (API 文档.md),详细介绍了每个类的功能与避坑点。
🚀 v3.0 核心特性一览
在保留了 <10MB 的极致轻量(除 EasyX 外零第三方依赖)基础上,v3.0.1 带来了大量现代桌面开发的硬核特性:
- 窗口自适应拉伸与锚点布局 (Anchor)
摆脱了传统 EasyX 窗口无法随意拉伸的限制。StellarX 深度子类化了 Win32 窗口过程(处理了WM_SIZE和WM_PAINT),不仅实现了无黑边、无残影的自由拉伸,还引入了LayoutMode::AnchorToEdges布局模式。只要给控件设置上下左右的锚点 (Anchor),窗口拉伸时控件就会自动重算坐标与宽高,完美自适应伸缩! - “全家桶”级常用控件库
你能想到的常用控件基本齐了:Button、Label、TextBox、Canvas、Table、Dialog、MessageBox,以及最新加入的TabControl(选项卡)。TabControl:支持页签上/下/左/右排布,一键压入“页签+页面”组合,内部使用透明背景快照机制切换,告别残影。
工业级细节:TextBox现已支持密码掩码模式(输入显示 ***)以及像素级的单行溢出截断(自动追加 ...);Table现支持在运行期动态清空和重置表头与数据。 - 极简的内建日志系统 (
SxLog)
开发复杂 GUI 经常被事件流绕晕?v3.0.0 原生内置了轻量级日志系统SxLog。无需引入额外库,使用SX_LOGI("Tag") <<"消息" 即可。支持控制台/文件双端输出、文件大小滚动、多线程行级互斥,甚至支持一键切换中英双语提示语。
⌨️ 5 分钟快速开始
环境要求:Windows 10+,VS 2019+ (C++17),以及匹配的 EasyX 库。推荐直接使用 CMake 构建(支持 out-of-source builds)。
下面展示一个最小可用示例:
#include "StellarX.h"
using namespace StellarX;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// 1. 创建窗口(800x600,白底,v3.0 默认支持自由拉伸缩放)
Window mainWindow(800, 600, 0, RGB(255 , 255 , 255), "Hello StellarX v3.0");
// 2. 创建一个按钮并设置点击事件(OOP 风格的回调机制)
auto btn = std::make_unique<Button>(340, 260, 120, 36, "点我试试");
btn->setOnClickListener([]()
{
// 调用内置的消息框工厂
MessageBox::showModal(nullptr, "按钮被点击啦!", "提示", MessageBoxType::OK);
});
// 3. 将控件托管给窗口,并执行首次绘制
mainWindow.addControl(std::move(btn));
mainWindow.draw();
// 4. 接管并运行事件循环(框架处理脏矩形重绘与 Win32 消息分发)
return mainWindow.runEventLoop();
}
注:不再需要手写 while(true) { getmessage(...) } 或是去查阅复杂的系统重绘 API,你只需把业务逻辑写在对应的 Lambda 回调里即可。
🛠️ 进阶应用片段:如何用锚点实现控件自适应?
当你拉伸窗口时,想要一个文本输入框始终贴紧底部并随着窗口变宽,只需两行代码:
auto input = std::make_unique<TextBox>(...);
// 开启锚点布局模式
input->setLayoutMode(LayoutMode::AnchorToEdges);
// 锁定左、右、下边缘
input->setAnchor(Anchor::Left | Anchor::Right | Anchor::Bottom);
结论:
如果你要做跨平台商业大作,Qt 是不二之选;但如果你只是想给你的课设、实验小工具(比如仓库中自带的 32 位寄存器查看器、登录界面 等 Demo)套上一个好看又好写的壳,StellarX 绝对够用且极其省心。
结语与致谢
StellarX 的架构采用了经典的 单一职责 (SRP) 和 依赖倒置 (DIP) 原则。对于学生来说,阅读 StellarX 源码(结构清晰,include/ 和 src/ 严格分离)本身就是一次极佳的面向对象实战学习。
感谢 EasyX 的地基
感谢在 GitHub 上提 Issue 的各位用户,是你们的反馈(比如嵌套容器坐标转换的修复、窗口拉伸优化的建议)让星垣变得更加稳定健壮!
目前项目已经完全开源(MIT 协议),可以直接在 Releases 页面下载 v3.0 版本的预编译库。如果你对这套框架感兴趣,或者对后续的流式布局(HBox/VBox)完善有想法,欢迎前往 GitHub 点亮你的 Star 🌟,或者提交 PR 与我一起共建。
星辰大海,代码为舟。
祝大家码出有趣的界面!
GitHub 传送门:https://github.com/Ysm-04/StellarX
添加评论
取消回复