diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 3685367..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(cmd.exe:*)", - "Bash(build_all.bat)", - "Bash(powershell.exe:*)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\" -S . -B build_x86 -A Win32)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\" --build build_x86 --config Debug --target EzUI)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\" --build build_x86 --config Release --target EzUI)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\" -S . -B build_x64 -A x64)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\":*)", - "Bash(\"C:/Program Files/CMake/bin/cmake.exe\" --build build_x64 --config Release --target EzUI)", - "Bash(file:*)", - "Bash(./test_build.bat)", - "Bash(./verify_scripts.bat:*)" - ] - } -} diff --git a/BUILD.md b/BUILD.md deleted file mode 100644 index 184b076..0000000 --- a/BUILD.md +++ /dev/null @@ -1,111 +0,0 @@ -# EzUI 构建说明 - -## 前置要求 - -### 必需工具 - -1. **CMake** (版本 3.0 或更高) - - 下载地址:https://cmake.org/download/ - - 安装后建议将 CMake 添加到系统 PATH 环境变量 - - 脚本会自动在以下位置查找 CMake: - - 系统 PATH 中的 `cmake` - - `C:\Program Files\CMake\bin\cmake.exe` - -2. **Visual Studio 2022** (包含 C++ 构建工具) - - 社区版即可免费使用 - - 下载地址:https://visualstudio.microsoft.com/downloads/ - - 安装时需要选择"使用 C++ 的桌面开发"工作负载 - -### 可选工具 - -- **Git** - 用于版本控制(如需从 GitHub 克隆代码) - -## 快速构建 - -### 构建所有配置 -```bash -build_all.bat -``` - -这将自动构建以下所有配置: -- x86 Debug → `lib\EzUI_Debug_Win32.lib` -- x86 Release → `lib\EzUI_Release_Win32.lib` -- x64 Debug → `lib\EzUI_Debug_x64.lib` -- x64 Release → `lib\EzUI_Release_x64.lib` - -### 单独构建 x86 -```bash -build_x86.bat -``` - -### 单独构建 x64 -```bash -build_x64.bat -``` - -## Visual Studio 开发 - -如果需要在 Visual Studio 中开发和调试: - -```bash -configure_vs.bat -``` - -这将生成 CMake 解决方案文件,然后可以打开: -- `build_x86\EzUI.sln` (x86 项目) -- `build_x64\EzUI.sln` (x64 项目) - -## 清理构建输出 - -```bash -clean.bat -``` - -这将删除以下目录: -- `build_x86/` - x86 构建目录 -- `build_x64/` - x64 构建目录 -- `lib/` - 静态库输出目录 - -## 手动 CMake 命令 - -如果你想使用 CMake 命令行: - -```bash -# 配置 x86 -cmake -S . -B build_x86 -A Win32 - -# 配置 x64 -cmake -S . -B build_x64 -A x64 - -# 编译 x86 Debug -cmake --build build_x86 --config Debug --target EzUI - -# 编译 x86 Release -cmake --build build_x86 --config Release --target EzUI - -# 编译 x64 Debug -cmake --build build_x64 --config Debug --target EzUI - -# 编译 x64 Release -cmake --build build_x64 --config Release --target EzUI -``` - -## 输出文件 - -所有静态库文件将输出到 `lib/` 目录,命名规则为: - -| 配置 | 平台 | 输出文件 | -|------|------|----------| -| Debug | x86 | `lib\EzUI_Debug_Win32.lib` | -| Release | x86 | `lib\EzUI_Release_Win32.lib` | -| Debug | x64 | `lib\EzUI_Debug_x64.lib` | -| Release | x64 | `lib\EzUI_Release_x64.lib` | - -## 构建配置说明 - -- **始终编译为静态库**:不再支持动态库选项 -- **输出目录**:所有库文件统一输出到 `lib/` 目录 -- **命名规则**:`EzUI_$(Configuration)_$(Platform).lib` -- **字符编码**:使用 UTF-8 编译 (`/utf-8`) -- **Unicode**:启用 Unicode 支持 -- **预处理器定义**:静态库会自动定义 `EZUI_STATIC` diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 4e451f4..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,196 +0,0 @@ -# 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(""); - 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`:失焦自动关闭,适用于菜单等临时窗口 - diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 314655e..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -cmake_minimum_required(VERSION 3.0...9.0) - -if(UNIX) - add_compile_options(-finput-charset=UTF-8) - add_compile_options(-fexec-charset=UTF-8) -elseif(WIN32) - add_compile_options(/utf-8) -endif() - -set(tag $,Debug,Release>) - -#让所有项目都使用UNICODE -add_definitions(-D_UNICODE -DUNICODE) - -project(EzUI) - -file(GLOB src ./include/EzUI/*.* ./sources/*.* ) - -# 始终编译为静态库 -add_library(EzUI STATIC ${src}) -target_compile_definitions(EzUI PUBLIC EZUI_STATIC) -target_include_directories(EzUI PRIVATE ./include/EzUI) -set_target_properties(EzUI PROPERTIES LINKER_LANGUAGE CXX) - -# 设置库文件输出目录和命名规则 -# 平台标识:根据架构判断 Win32 或 x64 -set(PLATFORM_TAG $,x64,Win32>) - -# 设置输出目录为 lib -set_target_properties(EzUI PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib" - ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/lib" - ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/lib" -) - -# 设置库文件命名规则为 EzUI_$(Configuration)_$(Platform).lib -set_target_properties(EzUI PROPERTIES - OUTPUT_NAME "EzUI_$_${PLATFORM_TAG}" -) - -# 定义函数: 添加资源打包任务并关联到指定项目 -function(add_resource_package TARGET_NAME INPUT_DIR OUTPUT_FILE) - set (ProjectName ${TARGET_NAME}_EzUI_ResourcePackager) - # 定义始终运行的伪目标 - add_custom_target( - ${ProjectName} # 更简洁的目标命名 - COMMAND ${CMAKE_SOURCE_DIR}/ResPackage.exe -package ${CMAKE_CURRENT_SOURCE_DIR}/${INPUT_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${OUTPUT_FILE} - COMMENT "Packaging resources for ${TARGET_NAME}..." - ) - # 将目标归类到专用文件夹 - set_target_properties(${ProjectName} PROPERTIES - FOLDER "CMakePredefinedTargets" # 在VS中归类到指定文件夹 - ) - # 主目标依赖伪目标 - add_dependencies(${TARGET_NAME} ${ProjectName}) -endfunction() - -#添加子项目 -option(BUILD_DEMO "Build demo projects" ON) -if(BUILD_DEMO) - add_subdirectory(./demo) -endif() diff --git a/README.md b/README.md deleted file mode 100644 index c5adf7f..0000000 --- a/README.md +++ /dev/null @@ -1,186 +0,0 @@ -# EzUI - -**EzUI** 是一个基于原生 Win32 消息机制和 Direct2D 的高性能桌面 UI 框架,具备强大的弹性布局、伪类样式支持和控件系统,目标是提供如 Web 前端般灵活、直观的界面开发体验。 - -> 🚀 支持高 DPI、分层窗口、响应式布局、CSS 风格皮肤、GIF 动画、控件组合与继承机制。未来将支持跨平台 2D 图形库扩展。 - ---- - -## ✨ 框架特色 - -- 🪱 **基于 Win32 消息机制**:轻量、无依赖,逻辑控件系统拦截并下发鼠标键盘消息 -- 🎨 **2D 图形绘制**:当前基于 Direct2D 绘图,具备高性能、高分辨率适配能力。 -- 🧹 **弹性布局系统**:支持自动宽高、自适应布局,开发体验类比前端 Flex 设计。 -- 🎭 **伪类 CSS 支持**:支持 `hover`、`active`、`checked` 等状态样式,类选择器、ID 选择器、组合选择器等完整选择器系统。 -- 🌟 **控件组合系统**:Label、Button、TextBox、CheckBox、RadioButton 等丰富控件可自由组合构建 UI。 -- 💡 **事件系统**:支持事件冒泡机制,可实现事件捕获与穿透。 -- 🧩 **高 DPI 适配**:框架自动处理 DPI 缩放与坐标换算,支持多显示器高分屏。 -- 🪪 **多种窗口类型支持**: - - `Window`:经典边框窗口 windows自动发送`WM_PAINT`消息绘制 - - `BorderlessWindow`:无边框、带阴影 windows自动发送`WM_PAINT`消息绘制 - - `LayeredWindow`:分层透明窗口,支持异形与实时重绘 手动发送 `WM_PAINT`消息进行绘制 - - `PopupWindow`:失焦自动关闭的弹出窗口,适用于菜单等 - ---- - -## 📆 快速开始 - -### 1. 下载源码 - -```bash -git clone https://github.com/NewYoungCode/EzUI.git -``` - -### 2. 安装 CMake - -请前往 [CMake 官网](https://cmake.org/download/) 下载安装。 - -### 3. 构建与运行 - -- 构建 32 位项目: - -```bash -build.bat -``` - -- 构建 64 位项目: - -```bash -build64.bat -``` - ---- - -## 📀 使用说明 - -### 🏁 程序入口 - -请在 `WinMain` 函数中创建 `Application` 实例并调用 `app.Exec()` 以启动消息循环: - -```cpp -#include -#include "EzUI/UIManager.h" -#include "Ezui/Window.h" -#include "Ezui/Application.h" - -using namespace ezui; - -class TestForm :public Window { -private: - UIManager umg;//ui管理器 -public: - TestForm() :Window(800, 600) { - //umg.LoadXmlFile("res/form.htm");//从文件中加载xml界面 - umg.LoadXmlData(" ");//从内存中加载布局 - umg.SetupUI(this);//设置ui - } - virtual ~TestForm() { - } - virtual void OnClose(bool& bClose) override { - int result = ::MessageBoxW(frm.Hwnd(), L"要退出程序吗?", L"提示", MB_YESNO | MB_ICONQUESTION); - if (result == IDYES) { - Application::Exit(0);//当窗口关闭时 整个程序退出 - } else { - bClose=false; // 用户点击了“否” 此标志设置为false将不会关闭 - } - } -}; - -//程序入口; -int APIENTRY wWinMain(_In_ HINSTANCE hInstance, - _In_opt_ HINSTANCE hPrevInstance, - _In_ LPWSTR lpCmdLine, - _In_ int nCmdShow) -{ - - Application app; - - TestForm testForm; - testForm.SetText(L"我是测试窗口"); - testForm.Show(nCmdShow); - - return app.Exec(); -}; -``` - -### 🧱 控件与组件列表(部分) - -- `Application`:EzUI 应用入口与消息循环控制器 -- `Window`:经典 Win32 边框窗口 -- `BorderlessWindow`:无边框带阴影窗口 -- `LayeredWindow`:支持透明和异形的分层窗口 -- `PopupWindow`:失焦自动关闭的弹出窗口 -- `Control`:所有控件基础类,封装鼠标命中、事件分发和重绘逻辑 -- `Label`:文字标签控件 -- `Button`:标准按钮控件 -- `TextBox`:文本输入框 -- `CheckBox` / `RadioButton`:复选框 / 单选框控件 -- `PictureBox`:图片显示控件,支持 GIF -- `ComboBox`:下拉框控件 -- `Menu`:菜单支持 -- `NotifyIcon`:托盘图标支持 -- `ScrollBar` / `HScrollBar` / `VScrollBar`:滚动条组件 -- `HLayout` / `VLayout`:水平/垂直布局容器 -- `HListView` / `VListView`:横向/纵向列表视图容器 -- `TileListView`:瓦片式列表视图 -- `TabLayout`:选项卡切换容器 -- `Spacer`:空隙组件,占位用 -- `ShadowBox`:为无边框窗口提供窗口阴影 -- `IFrame`:内嵌页面控件,功能类似 Web 前端中的 `