Files
EzUI/CLAUDE.md
2026-02-20 12:18:52 +08:00

197 lines
7.1 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.

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
EzUI 是一个基于原生 Win32 消息机制和 Direct2D 的 C++ 桌面 UI 框架,提供类似 Web 前端的 CSS 样式系统和弹性布局。
**核心特性:**
- 基于 Win32 消息机制,轻量无依赖
- Direct2D 硬件加速渲染,支持高 DPI
- CSS 风格样式系统,支持伪类和选择器
- 弹性布局系统,支持自动尺寸和停靠
- 事件冒泡机制,灵活的事件处理
- 控件组合与继承,一切皆控件
## 快速开始
```cpp
#include "EzUI/UIManager.h"
#include "EzUI/Window.h"
#include "EzUI/Application.h"
using namespace ezui;
class TestForm : public Window {
private:
UIManager umg;
public:
TestForm() : Window(800, 600) {
umg.LoadXmlData("<vbox><label text=\"hello world\"></label></vbox>");
umg.SetupUI(this);
}
};
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow) {
Application app;
TestForm form;
form.SetText(L"窗口标题");
form.Show(nCmdShow);
return app.Exec();
}
```
## 构建命令
**批处理脚本 (快速构建)**
```bash
build_x86.bat # 生成 32 位并构建 Debug/Release
build_x64.bat # 生成 64 位并构建 Debug/Release
build_all.bat # 同时构建 32 位和 64 位
```
**CMake 完整构建流程:**
```bash
# 配置阶段
cmake -S . -B build -A Win32 # 32 位配置
cmake -S . -B build -A x64 # 64 位配置
cmake -S . -B build -DBUILD_SHARED_LIBS=ON # 构建动态库
cmake -S . -B build -DBUILD_DEMO=OFF # 不构建 demo 项目
# 编译阶段
cmake --build build --config Debug # Debug 版本
cmake --build build --config Release # Release 版本
# 单独构建 EzUI 库
cmake --build build --target EzUI --config Debug
cmake --build build --target EzUI --config Release
```
## 核心架构
### 窗口类型 (继承层次)
- `Window` - 经典带边框窗口
- `BorderlessWindow` - 无边框带阴影窗口
- `LayeredWindow` - 分层透明窗口,支持异形
- `PopupWindow` - 失焦自动关闭的弹出窗口
### 控件系统
所有控件继承自 `Control` 基类,核心控件包括:
**基础控件:**
- `Label` - 文本标签
- `Button` - 标准按钮
- `TextBox` - 文本输入框(支持多行)
- `PictureBox` - 图片显示(支持 GIF 动画)
**选择控件:**
- `CheckBox` - 复选框
- `RadioButton` - 单选按钮
- `ComboBox` - 下拉选择框
**数据控件:**
- `TableView` - 表格视图
- `TreeView` - 树形视图
- `ListView` 系列:`HListView`(横向列表)、`VListView`(纵向列表)、`TileListView`(瓦片式)、`PagedListView`(分页列表)
**布局容器:**
- `HLayout` / `HBox` - 水平布局容器
- `VLayout` / `VBox` - 垂直布局容器
- `TabLayout` - 选项卡切换容器
- `Spacer` - 弹性/固定间距占位符
**功能控件:**
- `ScrollBar` / `HScrollBar` / `VScrollBar` - 滚动条
- `Menu` - 菜单系统
- `NotifyIcon` - 系统托盘图标
- `ProgressBar` - 进度条
- `IFrame` - 内嵌框架(类似 HTML iframe
- `ShadowBox` - 阴影容器
**动画系统:**
- `Animation` - 类似 Qt 的属性过渡动画
### 布局系统
- **尺寸优先级**:比例尺寸 (`SetRateWidth/Height`) > 绝对尺寸 (`SetFixedSize`) > 控件内容大小
- **自动布局**`SetAutoWidth/Height` 让控件根据内容自动调整大小
- **停靠布局**`SetDockStyle` 支持 Fill/Vertical/Horizontal 停靠
- **布局状态**`TryPendLayout`/`ResumeLayout` 批量添加控件后统一布局
### 样式与渲染
- `UIManager` - UI 样式与资源管理,支持 XML 布局加载
- `UISelector` - CSS 选择器匹配系统支持类选择器、ID 选择器、组合选择器)
- `Direct2DRender` - Direct2D 绘图实现,支持硬件加速
- `RenderTypes` - 颜色、对齐方式等绘图类型定义
- `UIDef` - 框架内使用的宏定义集合
- `EzUI.h` - 框架主接口头文件,定义事件类、枚举、全局资源等核心结构
**CSS 样式特性:**
- 伪类支持:`:hover``:active``:checked``:disabled`
- 样式属性width、height、background-color、border、color、font 等
- 选择器类型标签选择器、类选择器、ID 选择器、组合选择器
### 事件系统
- 支持事件冒泡机制,可实现事件捕获与穿透
- `NotifyFlags` 控制控件哪些事件需要通知窗口
- `Event` 枚举定义所有事件类型(鼠标、键盘、绘制等),支持位运算组合
- 事件穿透控制:通过 `m_hitTestEnabled` 控制命中测试
- Debug 模式下按 F11 可查看布局信息和控件边界
### 线程模型
- UI 线程:`Application::Run` 启动消息循环
- 跨线程调用:`BeginInvoke`(异步)/ `Invoke`(同步)
- 全局隐藏窗口 `__EzUI_MessageWnd` 用于线程通讯
### 资源管理
- 控件树内存由父控件自动管理:`Attach`/`Detach`
- 图片资源通过 `PtrManager` 自动释放
- XML 布局加载后由 `UIManager` 管理生命周期
- 资源打包系统:通过 `add_resource_package` CMake 函数将资源打包为 `.res` 文件
**资源打包流程:**
1. 在 demo 的 CMakeLists.txt 中调用 `add_resource_package(target source_dir output_file)`
2. 构建时会自动运行 `ResPackage.exe` 工具
3. 生成的 `.res` 文件可以在运行时通过 `Resource.h` 中的函数加载
4. 支持本地文件和资源文件的自动加载(通过 `add_resource_package` 函数)
### 调试技巧
- 在 Debug 模式下运行时,按下 `F11` 可实时查看布局信息,高亮显示控件边界
## Demo 项目
- `helloWorld` - 基础示例,演示最简单的窗口创建
- `ResPackage` - 资源打包工具,用于将资源文件打包为 `.res` 格式
- `QQ` - 仿 QQ 登录界面,展示资源打包和 XML 布局加载
- `kugou` - 酷狗音乐播放器,演示 VLC 集成和复杂 UI 交互(需要额外依赖)
- `TableViewDemo` - 表格控件演示,展示 LayeredWindow + VLayout + TableView + 右键菜单的组合使用
**CMake Demo 目标:**
- 所有 demo 都使用 `add_executable(... WIN32 ...)` 创建
- 通过 `add_resource_package(target source_dir output_file)` 自动打包资源
- 资源文件通过 `source_group` 组织到 VS 的 "res" 筛选项下
## 开发约定
**目录结构:**
- 头文件:`include/EzUI/` 目录
- 源文件:`sources/` 目录
- Demo 项目:`demo/` 目录
**核心理念:**
- 一切皆控件,纯代码组合 UI
- 使用 CSS 驱动视觉,结构与样式分离
- XML 布局通过 `UIManager::LoadXmlFile()``LoadXmlData()` 加载
**CMake 自定义命令:**
- `add_resource_package(target source_dir output_file)` - 打包资源文件为 `.res` 格式
- `target` 需要与 `add_executable` 的项目名匹配
- 资源会在构建时自动打包,程序通过 `Resource.h` 提供的函数访问
- 需要先构建 `ResPackage` 工具(位于 `demo/ResPackage`
**窗口绘制机制:**
- `Window` / `BorderlessWindow`Windows 自动发送 `WM_PAINT` 消息
- `LayeredWindow`:需手动发送 `WM_PAINT` 消息进行绘制(支持实时重绘)
- `PopupWindow`:失焦自动关闭,适用于菜单等临时窗口