26-2-25 在用版本备份
This commit is contained in:
77
CLAUDE.md
Normal file
77
CLAUDE.md
Normal file
@@ -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 驱动视觉,结构与样式分离
|
||||
- 中文注释,中文沟通
|
||||
50
CMakeLists.txt
Normal file
50
CMakeLists.txt
Normal file
@@ -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 $<IF:$<CONFIG:Debug>,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()
|
||||
199
README.md
Normal file
199
README.md
Normal file
@@ -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 <Windows.h>
|
||||
#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("<vbox> <label text=\"hello world\"></label> </vbox>");//从内存中加载布局
|
||||
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 前端中的 `<iframe>`
|
||||
- `UIDef`:框架内使用的宏定义集合
|
||||
- `UIManager`:UI 样式与资源统一管理
|
||||
- `UISelector`:选择器匹配系统,实现类选择器、链式查询控件
|
||||
- `UIString` / `tinystr.h` / `tinyxml.h`:字符串处理与 XML 配置解析支持
|
||||
- `RenderTypes`:绘图相关类型定义(颜色、对齐方式等)
|
||||
- `Direct2DRender`:Direct2D 绘图实现类
|
||||
- `Bitmap`:图像资源封装
|
||||
- `Resource.h`:自定义资源管理类(非 VS rc 文件),用于手动加载与管理框架资源
|
||||
- `Timer` / `Task`:定时与异步任务处理辅助类
|
||||
- `EzUI.h`:框架主接口头文件,定义事件类、枚举、全局资源等核心结构
|
||||
- `Animation.h`:类似于QT的那种过渡动画
|
||||
|
||||
### 🎨 样式示例
|
||||
|
||||
```css
|
||||
#submitBtn {
|
||||
width: 100px; /*静态样式时支持调整大小*/
|
||||
height: 30px; /*静态样式时支持调整大小*/
|
||||
background-color: #0078d7;
|
||||
}
|
||||
|
||||
#submitBtn:hover {
|
||||
background-color: #005a9e;
|
||||
}
|
||||
|
||||
.classA .classB { /*多选择器*/
|
||||
color:#ffffff;
|
||||
}
|
||||
|
||||
label{ /*标签选择器*/
|
||||
color:#ffffff;
|
||||
}
|
||||
|
||||
.check:checked {
|
||||
border:1px;
|
||||
border-radius:10px;
|
||||
border-color: #005a9e;
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 调试技巧
|
||||
|
||||
- 在 Debug 模式下运行时,按下 `F11` 可实时查看布局信息,高亮显示控件边界。
|
||||
|
||||
---
|
||||
|
||||
## 🧬 开发理念
|
||||
|
||||
- **“一切皆控件”**:无 UI 描述文件,纯代码式组件组合;
|
||||
- **“CSS 驱动视觉”**:结构和样式分离;
|
||||
- **“面向前端思维”**:布局、交互风格向 Web 靠拟;
|
||||
- **“跨平台可拟扩”**:绘图模块可替换(未来可能会使用跨平台图形库);
|
||||
|
||||
---
|
||||
|
||||
## 📖 学习 & 技术支持
|
||||
|
||||
- 视频教程:https://space.bilibili.com/240269358/video
|
||||
- QQ:718987717
|
||||
- QQ群:758485934
|
||||
- 邮箱:[19980103ly@gmail.com]/[19980103ly@gmail.com]
|
||||
- 微信:wx19980103yon
|
||||
|
||||
---
|
||||
|
||||
## 📄 License
|
||||
|
||||
|
||||
4
build_x64.bat
Normal file
4
build_x64.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
chcp 65001
|
||||
@echo off
|
||||
cmake -S . -B build_x64 -A x64 -DBUILD_EZUI=OFF
|
||||
pause
|
||||
4
build_x86.bat
Normal file
4
build_x86.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
chcp 65001
|
||||
@echo off
|
||||
cmake -S . -B build_x86 -A Win32 -DBUILD_EZUI=OFF
|
||||
pause
|
||||
@@ -93,11 +93,3 @@ set_property(TARGET QQ PROPERTY FOLDER "demo")
|
||||
COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/kugou/extract${ARCH_NAME}.bat" "$<TARGET_FILE_DIR:kugou>"
|
||||
COMMENT "Running extract.bat to conditionally extract dll.zip"
|
||||
)
|
||||
|
||||
# TableView Demo - LayeredWindow + VLayout + TableView + 右键菜单
|
||||
project(TableViewDemo)
|
||||
file(GLOB src TableViewDemo/*.*)
|
||||
add_executable(TableViewDemo WIN32 ${src})
|
||||
target_include_directories(TableViewDemo PRIVATE ${include})
|
||||
target_link_libraries(TableViewDemo PRIVATE EzUI)
|
||||
set_property(TARGET TableViewDemo PROPERTY FOLDER "demo")
|
||||
|
||||
BIN
demo/QQ/QQ.res
BIN
demo/QQ/QQ.res
Binary file not shown.
Reference in New Issue
Block a user