Files
StellarX/README.md
2025-10-27 16:29:43 +08:00

322 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 星垣 (StellarX) GUI Framework
[English document](README.en.md)
------
![GitHub all releases](https://img.shields.io/github/downloads/Ysm-04/StellarX/total)
[![Star GitHub Repo](https://img.shields.io/github/stars/Ysm-04/StellarX.svg?style=social&label=Star%20This%20Repo)](https://github.com/Ysm-04/StellarX)
![Version](https://img.shields.io/badge/Version-2.1.0-brightgreen.svg)
![Download](https://img.shields.io/badge/Download-2.1.0_Release-blue.svg)
![C++](https://img.shields.io/badge/C++-17+-00599C?logo=cplusplus&logoColor=white)
![Windows](https://img.shields.io/badge/Platform-Windows-0078D6?logo=windows)
![EasyX](https://img.shields.io/badge/Based_on-EasyX-00A0EA)
![License](https://img.shields.io/badge/License-MIT-blue.svg)
![Architecture](https://img.shields.io/badge/Architecture-Modular%20OOP-brightgreen)
![CMake](https://img.shields.io/badge/Build-CMake-064F8C?logo=cmake)
> **「繁星为界,轻若尘埃」** —— 一个为 Windows 平台打造的、极致轻量级、高度模块化的 C++ 原生 GUI 框架。
`星垣 (StellarX)` 反对臃肿,拒绝动辄数百 MB 的依赖、漫长编译与高门槛学习曲线,回归本质:以精简代码、清晰架构与高效率,解决桌面应用开发的核心需求。
这是一个**教学级、工具级**框架,帮助开发者深入理解 GUI 原理,并快速构建轻量工具。
---
## 🆕 v2.1.0 有何变化
- **中英文双语 API文档**
- 文档详细介绍了每个类以及API描述、功能和需要注意的地方详细介绍了每个控件
- **窗口可拉伸/最大化补强(基于 EasyX + Win32**
子类化窗口过程,处理 `WM_GETMINMAXINFO / WM_SIZE / WM_EXITSIZEMOVE / WM_ERASEBKGND / WM_PAINT`,启用 `WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS`。在 `WM_PAINT` 期进行**整窗背景绘制**(纯色/图片),彻底消除黑边与最大化“残影”;合并拉伸为**一次性重绘**。
- **布局管理器(第一阶段)**
`Canvas` 支持 `LayoutKind::{Absolute, HBox, VBox, Grid(预留), Flow(预留), Stack(预留)}``LayoutParams`(边距、固定尺寸、`weight``Align{Start,Center,End,Stretch}`);实装 **HBox/VBox** 自动布局(容器仍绝对定位,可嵌套)。
- **选项卡Tabs雏形**
页签条与页面容器分离;透明主题下使用**背景快照**避免叠影。
- **按钮文本单行截断MBCS中/英分治)**
基于像素宽度阈值的 `...` 截断,杜绝半字符。
- **悬停提示Tooltip**
`Label` 实现,支持延时出现、自动隐藏;控件级**背景快照/恢复**。
详见 `CHANGELOG.md / CHANGELOG.en.md`
---
## 📦 项目结构与设计哲学
星垣采用经典 **OOP****模块化** 设计,结构清晰:
```markdown
StellarX/
├── include/
│ └── StellarX/
│ ├── StellarX.h
│ ├── CoreTypes.h # 唯一定义源(枚举/结构体)
│ ├── Control.h
│ ├── Button.h
│ ├── Window.h
│ ├── Label.h
│ ├── TextBox.h
│ ├── Canvas.h
│ ├── Dialog.h # v2.0.0
│ ├── MessageBox.h # v2.0.0
│ └── Table.h
├── src/
│ ├── Control.cpp
│ ├── Button.cpp
│ ├── Window.cpp
│ ├── Label.cpp
│ ├── TextBox.cpp
│ ├── Canvas.cpp
│ ├── Table.cpp
│ ├── Dialog.cpp # v2.0.0
│ └── MessageBox.cpp # v2.0.0
├── examples/
│ └── demo.cpp
├── docs/
│ └── CODE_OF_CONDUCT.md
├── CMakeLists.txt
├── CONTRIBUTING.md
├── CHANGELOG.md
├── CHANGELOG.en.md
├── Doxyfile
├── LICENSE
├──API 文档.md
├──API Documentation.en.md
└── README.md
```
**设计理念:**
1. **单一职责SRP**:每个类/文件只做一件事。
2. **依赖倒置DIP**:高层模块依赖抽象(`Control`),而非具体控件。
3. **开闭原则OCP**:继承 `Control` 可扩展新控件,无需修改既有代码。
4. **一致性**:所有控件统一 `draw()` / `handleEvent()` 接口。
## 🚀 核心特性
- **极致轻量**:除 EasyX 外无外部重量级依赖。
- **模块清晰**`CoreTypes.h` 统一类型与枚举。
- **原生性能**EasyX + Win32执行高效、内存低占用常见 <10MB
- **控件齐全**Button、Label、TextBox、Canvas、Table、Dialog、MessageBox。
- **高度自定义**:颜色、形状(矩形/圆角/圆/椭圆)、填充、字体等皆有枚举。
- **简单直观 API**OOP 设计,代码即文档。
- **标准工程结构**include/src 分离,支持 CMake。
- **增强事件系统**`handleEvent` 返回是否消费(自 v2.0.0)。
- **对话框系统**:支持模态/非模态,自动背景保存与恢复。
------
## ⚡ 快速开始5 分钟上手)
> 从 [Releases](https://github.com/Ysm-04/StellarX/releases/latest) 获取预编译包。
### 环境要求
- **系统**Windows 10+
- **编译器**C++17如 VS 2019+
- **图形库** [EasyX](https://easyx.cn/) 2022+(与编译器匹配)
- **构建**CMake 3.12+(可选)
### 安装 EasyX
1. 下载 EasyX 最新版
2. 按 VS 版本安装匹配组件
3. 框架会自动链接,无需额外配置
### CMake 构建(推荐)
```
git clone https://github.com/Ysm-04/StellarX.git
cd StellarX
mkdir build && cd build
cmake ..
cmake --build .
./examples/Demo
```
### 手动集成
- 拷贝 `include``src`
- 配置头文件搜索路径:`include/StellarX/`
- 将全部 `.cpp` 加入工程
### 第一个可拉伸窗口
```c++
#include "StellarX.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//默认启动拉伸,当前尺寸为最小尺寸
Window mainWindow(800, 600, 0, RGB(255,255,255), "我的星垣应用");
mainWindow.draw();
// 添加你的控件...
// mainWindow.addControl(std::move(btn));
mainWindow.runEventLoop();
return 0;
}
```
> 实现要点:在 `WM_PAINT` 期进行**整窗背景绘制**(纯色/图片),并配合 EasyX 批量绘制抑制频闪与黑边。
------
## 📚 核心类型(`CoreTypes.h` 摘要)
### 枚举
| 枚举 | 描述 | 常用值 |
| ------------------ | ---------- | ------------------------------------------------------------ |
| `ControlShape` | 几何形状 | `RECTANGLE`, `B_RECTANGLE`, `ROUND_RECTANGLE`, `CIRCLE`, `ELLIPSE` |
| `ButtonMode` | 按钮行为 | `NORMAL`, `TOGGLE`, `DISABLED` |
| `TextBoxMode` | 文本框模式 | `INPUT_MODE`, `READONLY_MODE` |
| `FillMode` | 填充模式 | `SOLID`, `NULL`, `HATCHED` |
| `FillStyle` | 图案样式 | `HORIZONTAL`, `CROSS` |
| `LineStyle` | 线型 | `SOLID`, `DASH`, `DOT` |
| `MessageBoxType` | 消息框类型 | `OK`, `OKCancel`, `YesNo`, ... |
| `MessageBoxResult` | 结果 | `OK`, `Cancel`, `Yes`, `No`, `Abort`, `Retry`, `Ignore` |
### 结构体
| 结构体 | 描述 |
| -------------- | -------------------------------------- |
| `ControlText` | 字体/字号/颜色/粗体/斜体/下划线/删除线 |
| `RouRectangle` | 圆角矩形的角部椭圆尺寸 |
------
## 🧩 控件库
### 1) 基础控件
| 控件 | 头文件 | 描述 | 关键点 |
| ------- | ----------- | ----------- | ------------------------------------------------------------ |
| Button | `Button.h` | 多功能按钮 | 形状/模式、悬停/点击色、回调,**单行截断** + **Tooltip**v2.1.0 |
| Label | `Label.h` | 文本标签 | 透明/不透明背景,自定义字体 |
| TextBox | `TextBox.h` | 输入/显示框 | 输入/只读,整合 EasyX `InputBox` |
### 2) 容器控件
| 控件 | 头文件 | 描述 |
| ------ | ---------- | ------------------------------------------------------------ |
| Canvas | `Canvas.h` | 父容器,自定义边框/背景,**内置 HBox/VBox 自动布局**v2.1.0 |
| Window | `Window.h` | 顶层容器,消息循环与分发,**可拉伸**v2.1.0 |
### 3) 高级控件
| 控件 | 头文件 | 描述 | 关键点 |
| ------ | ---------- | -------- | --------------------------------------------------------- |
| Table | `Table.h` | 数据表格 | 分页/表头/列宽自动、翻页控件重叠/透明叠影已修复v2.1.0 |
| Dialog | `Dialog.h` | 对话框 | 支持模态/非模态,自动布局与背景保存/恢复 |
### 4) 静态工厂
| 控件 | 头文件 | 描述 | 关键点 |
| ---------- | -------------- | ---------- | ----------------------------------- |
| MessageBox | `MessageBox.h` | 消息框工厂 | 静态 API支持模态/非模态;内置去重 |
------
## 📐 布局管理HBox/VBox
- **容器级**`Canvas::layout.kind = HBox / VBox / Absolute (默认)`;可选容器 `padding`。
- **子项级**`LayoutParams`
- `margin{L,R,T,B}`
- `fixedW/fixedH``-1` 表示沿用控件当前尺寸)
- `weight`主轴分配权重HBox→宽、VBox→高
- `alignX/alignY` = `Start/Center/End/Stretch`(用于次轴方向对齐/拉伸)
**示例**(三列水平自适应,整体垂直拉伸):
```c++
Canvas row(20, 20, 760, 120);
row.layout.kind = LayoutKind::HBox;
auto mk = [](int w, int h, float weight){
auto c = std::make_unique<Control>(0,0,w,h);
c->layout.marginL = 8; c->layout.marginR = 8;
c->layout.alignY = LayoutParams::Stretch;
c->layout.weight = weight;
return c;
};
row.addControl(mk(100,40, 1.f));
row.addControl(mk(100,40, 2.f));
row.addControl(mk(100,40, 1.f));
```
------
## 🗂 选项卡Tabs早期版本
- 页签条(按钮组) + 页面容器(`Canvas`
- 透明主题:页面区域**背景快照**切换,避免叠影
- API 草图:`tabs.addPage(title, canvasPtr); tabs.setActive(index);`
------
## ✂️ 文本单行截断 & 🫧 Tooltip
- **按钮截断**:多字节字符集下**中/英分治**,基于像素宽度阈值追加 `...`
- **Tooltip**:延时出现、自动隐藏;默认文字=按钮文本,可自定义;使用控件级**背景快照/恢复**
------
## 🧊 透明背景与背景快照
- **通用约定**:首绘前 `captureBackground(rect)`,隐藏/覆盖前 `restoreBackground()`
- **Table**:快照区域**包含表头**;翻页后立即恢复 + 重绘,分页控件整体居中
------
## 🔧 高级主题与最佳实践
- 自定义控件:继承 `Control`,实现 `draw()` / `handleEvent()`
- 性能:
- **脏矩形**:状态改变时置 `dirty=true`,按需重绘
- **避免额外 `cleardevice()`**:背景已由 `WM_PAINT` 统一处理
- 绘制前确保 `SetWorkingImage(nullptr)` 将输出落到屏幕
- 事件消费:处理后返回 `true` 终止传播
------
## ⚠️ 适用与限制
- 不适合高性能游戏/复杂动画;极端 DPI 需复核度量
- 暂无无障碍能力
- Windows 专用,不跨平台
- 复杂商业前端建议用 Qt / wxWidgets / ImGui / Electron
------
## 📜 许可证
MIT见 `LICENSE`)。
## 👥 贡献指南
- 遵循现有 C++ 风格
- 新特性需附示例与 README 更新
- 提交前请自测,并说明变更动机
- Bug/想法请提 Issue
## 🙏 致谢
- 感谢 [EasyX](https://easyx.cn/)
- 感谢推崇**简洁/高效/清晰**的开发者
------
**星辰大海,代码为舟。**
## 📞 支持与反馈
- 查看 [examples/](examples/)
- 查阅 [更新日志](CHANGELOG.md / CHANGELOG.en.md)
- 在 GitHub 提交 Issue