StellarX

A lightweight, modular C++ GUI framework for Windows

【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 带来了大量现代桌面开发的硬核特性:

  1. 窗口自适应拉伸与锚点布局 (Anchor)
    摆脱了传统 EasyX 窗口无法随意拉伸的限制。StellarX 深度子类化了 Win32 窗口过程(处理了 WM_SIZE WM_PAINT),不仅实现了无黑边、无残影的自由拉伸,还引入了 LayoutMode::AnchorToEdges 布局模式。只要给控件设置上下左右的锚点 (Anchor),窗口拉伸时控件就会自动重算坐标与宽高,完美自适应伸缩!
  2. “全家桶”级常用控件库
    你能想到的常用控件基本齐了:ButtonLabelTextBoxCanvasTableDialogMessageBox,以及最新加入的 TabControl (选项卡)。TabControl:支持页签上/下/左/右排布,一键压入“页签+页面”组合,内部使用透明背景快照机制切换,告别残影。
    工业级细节:TextBox 现已支持密码掩码模式(输入显示 ***)以及像素级的单行溢出截断(自动追加 ...);Table 现支持在运行期动态清空和重置表头与数据。
  3.  极简的内建日志系统 (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

添加评论