From cf51900c96b6c115c9ae8e4740696781f8b13639 Mon Sep 17 00:00:00 2001 From: anry Date: Wed, 25 Feb 2026 21:35:10 +0800 Subject: [PATCH] =?UTF-8?q?26-2-25=20=E5=9C=A8=E7=94=A8=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 77 +++++++++++++++++ CMakeLists.txt | 50 +++++++++++ README.md | 199 ++++++++++++++++++++++++++++++++++++++++++++ build_x64.bat | 4 + build_x86.bat | 4 + demo/CMakeLists.txt | 8 -- demo/QQ/QQ.res | Bin 4597312 -> 4057174 bytes 7 files changed, 334 insertions(+), 8 deletions(-) create mode 100644 CLAUDE.md create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 build_x64.bat create mode 100644 build_x86.bat diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..95f74f9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,77 @@ +# 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 样式系统和弹性布局。 + +## 构建命令 + +```bash +build.bat # 构建 32 位静态库 +build64.bat # 构建 64 位静态库 +``` + +CMake 构建: +```bash +cmake -B build +cmake --build build +``` + +静态库/动态库切换: +```bash +cmake -B build -DBUILD_SHARED_LIBS=ON # 动态库 +cmake -B build -DBUILD_SHARED_LIBS=OFF # 静态库(默认) +``` + +## 核心架构 + +### 窗口类型 (继承层次) +- `Window` - 经典带边框窗口 +- `BorderlessWindow` - 无边框带阴影窗口 +- `LayeredWindow` - 分层透明窗口,支持异形 +- `PopupWindow` - 失焦自动关闭的弹出窗口 + +### 控件系统 +所有控件继承自 `Control` 基类,核心控件包括: +- 基础控件:`Label`, `Button`, `TextBox`, `PictureBox` +- 选择控件:`CheckBox`, `RadioButton`, `ComboBox` +- 布局容器:`HLayout`, `VLayout`, `HListView`, `VListView`, `TileListView`, `TabLayout` +- 功能控件:`ScrollBar`, `Menu`, `NotifyIcon`, `ProgressBar`, `TreeView`, `Spacer` + +### 布局系统 +- **尺寸优先级**:比例尺寸 (`SetRateWidth/Height`) > 绝对尺寸 (`SetFixedSize`) > 控件内容大小 +- **自动布局**:`SetAutoWidth/Height` 让控件根据内容自动调整大小 +- **停靠布局**:`SetDockStyle` 支持 Fill/Vertical/Horizontal 停靠 +- **布局状态**:`TryPendLayout`/`ResumeLayout` 批量添加控件后统一布局 + +### 样式与渲染 +- `UIManager` - UI 样式与资源管理,支持 XML 布局加载 +- `UISelector` - CSS 选择器匹配系统 +- `Direct2DRender` - Direct2D 绘图实现 +- `RenderTypes` - 颜色、对齐方式等绘图类型 + +### 事件系统 +- 支持事件冒泡机制,可实现事件捕获与穿透 +- `NotifyFlags` 控制控件哪些事件需要通知窗口 +- `Event` 枚举定义所有事件类型,支持位运算组合 +- Debug 模式下按 F11 可查看布局信息和控件边界 + +### 线程模型 +- UI 线程:`Application::Run` 启动消息循环 +- 跨线程调用:`BeginInvoke`(异步)/ `Invoke`(同步) +- 全局隐藏窗口 `__EzUI_MessageWnd` 用于线程通讯 + +### 资源管理 +- 控件树内存由父控件自动管理:`Attach`/`Detach` +- 图片资源通过 `PtrManager` 自动释放 +- XML 布局加载后由 `UIManager` 管理生命周期 + +## 开发约定 + +- 头文件位于 `include/EzUI/` 目录 +- 源文件位于 `sources/` 目录 +- 一切皆控件,纯代码组合 UI +- 使用 CSS 驱动视觉,结构与样式分离 +- 中文注释,中文沟通 diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..62c98fd --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,50 @@ +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/*.* ) +# 添加一个选项,供用户选择构建静态库或动态库 +option(BUILD_SHARED_LIBS "Build shared library instead of static library" OFF) +if(BUILD_SHARED_LIBS) + add_library(EzUI SHARED ${src}) +else() + add_library(EzUI STATIC ${src}) + target_compile_definitions(EzUI PUBLIC EZUI_STATIC) +endif() +target_include_directories(EzUI PRIVATE ./include/EzUI) +set_target_properties(EzUI PROPERTIES LINKER_LANGUAGE CXX) + +# 定义函数: 添加资源打包任务并关联到指定项目 +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 new file mode 100644 index 0000000..d492dfa --- /dev/null +++ b/README.md @@ -0,0 +1,199 @@ +# 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 前端中的 `