# bny.gui **Repository Path**: kllxs_admin/bny.gui ## Basic Information - **Project Name**: bny.gui - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-09 - **Last Updated**: 2026-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Bny.Gui > 基于 GLFW + RmlUi 的 C 语言 GUI 动态库,编译为单个无依赖的 DLL。 ## 项目结构 ``` bny.gui/ ├── CMakeLists.txt # 根构建文件 ├── Capi-RmlUi.h # C API 头文件(带 DLL 导出宏) ├── Capi-RmlUi.cpp # C API 封装实现 ├── glfw/ # GLFW 3.5(窗口/输入/OpenGL 上下文) ├── RmlUi/ # RmlUi 6.3(HTML/CSS UI 引擎) ├── example/ # 示例源代码 │ ├── CMakeLists.txt # 示例构建文件 │ ├── main.c # 集成测试套件(5合1) │ ├── 01_hello_rmlui.c # 基本生命周期 │ ├── 02_context_document.c # 上下文与文档加载 │ ├── 03_full_loop.c # 完整 GUI 主循环(带中文) │ ├── 04_element_api.c # Element API 操作 │ ├── 05_event_system.c # 事件系统 │ └── assets/ # 字体和 RML 资源 │ ├── LatoLatin-Regular.ttf │ ├── LatoLatin-Bold.ttf │ ├── Deng.ttf # 等线(中文回退) │ ├── demo.rml │ └── simple.rml ├── bin/ # 预编译产物 │ ├── bny_gui.dll # 核心动态库 │ ├── 01_hello_rmlui.exe # 独立示例程序 │ ├── 02_context_document.exe │ ├── 03_full_loop.exe │ ├── 04_element_api.exe │ ├── 05_event_system.exe │ ├── bny_gui_example.exe # 集成测试套件 │ └── assets/ # 运行时资源 └── README.md ``` ## 依赖 | 依赖 | 版本 | 说明 | |------|------|------| | CMake | ≥ 3.16 | 构建系统 | | MinGW64 或 LLVM/Clang | 最新 | Windows 编译器 | | FreeType | 任意 | 字体渲染(通过 MSYS2/vcpkg 安装) | ## 构建指南 ### 方式一:MSYS2 MinGW64(推荐) ```bash # 1. 安装 MSYS2(https://www.msys2.org/)后,打开 MSYS2 MinGW64 终端 # 2. 安装构建工具和依赖 pacman -S mingw-w64-x86_64-cmake \ mingw-w64-x86_64-ninja \ mingw-w64-x86_64-gcc \ mingw-w64-x86_64-freetype # 3. 配置并构建 cd /c/project/c-cpp/bny.gui cmake -B build -G "Ninja" \ -DCMAKE_BUILD_TYPE=Release \ -DBNY_GUI_STATIC_RUNTIME=ON cmake --build build # 4. 产物位于 build/example/ ``` ### 方式二:LLVM/Clang(MinGW 目标) ```bash pacman -S mingw-w64-x86_64-cmake \ mingw-w64-x86_64-ninja \ mingw-w64-x86_64-clang \ mingw-w64-x86_64-lld \ mingw-w64-x86_64-freetype cd /c/project/c-cpp/bny.gui cmake -B build -G "Ninja" \ -DCMAKE_BUILD_TYPE=Release \ -DBNY_GUI_STATIC_RUNTIME=ON \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ cmake --build build ``` ### 方式三:vcpkg + MinGW ```bash vcpkg install freetype:x64-mingw-static cmake -B build -G "Ninja" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake \ -DVCPKG_TARGET_TRIPLET=x64-mingw-static cmake --build build ``` ## CMake 选项 | 选项 | 默认值 | 说明 | |------|--------|------| | `BNY_GUI_STATIC_RUNTIME` | `ON` | 静态链接 C/C++ 运行时,消除对 MinGW DLL 的依赖 | | `BNY_GUI_BUILD_EXAMPLE` | `ON` | 是否编译 example/ 下的测试示例程序 | | `CMAKE_BUILD_TYPE` | — | `Release` / `Debug` / `RelWithDebInfo` | ## 运行示例 `bin/` 目录已包含预编译的 DLL 和所有示例,直接运行: ```cmd cd bin 01_hello_rmlui.exe # 基本生命周期 02_context_document.exe # 上下文与文档 03_full_loop.exe # 完整 GUI 窗口(中英文,5秒退出) 04_element_api.exe # Element API 操作 05_event_system.exe # 事件系统 bny_gui_example.exe # 集成测试套件(全部/按编号) bny_gui_example.exe 3 # 只运行测试3 ``` ### 示例说明 | 文件 | 内容 | |------|------| | `01_hello_rmlui` | 最简 5 步:后端初始化→注册接口→初始化 RmlUi→关闭 RmlUi→关闭后端 | | `02_context_document` | 创建上下文、从文件加载 RML、从内存加载 RML(兜底)、DOM 检查 | | `03_full_loop` | 完整 GUI 主循环,中英文混排(LatoLatin + 等线字体回退),300帧自动退出 | | `04_element_api` | 7 种 Element 操作:ID 查找、CSS 选择器、特性读写、CSS 类、DOM 导航、Inner RML、地址字符串 | | `05_event_system` | 自定义事件注册、click/mouseover/keydown 事件监听 | ## 使用示例 ```c #include "Capi-RmlUi.h" int main(void) { // 1. 初始化 GLFW 后端 rmlui_backend_initialize("My App", 1280, 720, true); // 2. 注册后端接口 rmlui_register_backend_interfaces( rmlui_backend_get_system_interface(), rmlui_backend_get_render_interface()); // 3. 初始化 RmlUi rmlui_initialise(); // 4. 加载字体(第二个参数 = true 为回退字体) rmlui_load_font_face("assets/LatoLatin-Regular.ttf", true, RMLUI_FONT_WEIGHT_NORMAL); rmlui_load_font_face("assets/Deng.ttf", true, RMLUI_FONT_WEIGHT_NORMAL); // 5. 创建上下文并加载文档 RmlUi_Context ctx = rmlui_create_context("main", 1280, 720); RmlUi_Document doc = rmlui_context_load_document(ctx, "assets/demo.rml"); rmlui_document_show(doc, RMLUI_MODAL_NONE, RMLUI_FOCUS_AUTO, RMLUI_SCROLLFLAG_AUTO); // 6. 主循环 while (rmlui_backend_process_events(ctx, NULL, false)) { rmlui_context_update(ctx); rmlui_backend_begin_frame(); rmlui_context_render(ctx); rmlui_backend_present_frame(); } // 7. 清理 rmlui_shutdown(); rmlui_backend_shutdown(); return 0; } ``` ## 技术说明 - **单个 DLL**:GLFW、RmlUi Core、RmlUi Debugger、GLFW_GL3 后端全部静态链接后打包进 `bny_gui.dll` - **无运行时依赖**:通过 `-static-libgcc -static-libstdc++ -static` 消除对 `libgcc_s_seh-*.dll`、`libstdc++-6.dll`、`libwinpthread-1.dll` 的依赖 - **C 接口**:所有 API 均为纯 C 函数,使用 `__declspec(dllexport)` 导出 - **C++17 内部**:RmlUi 使用 C++17,但对 C 调用者完全透明 - **未修改第三方源码**:`glfw/` 和 `RmlUi/` 目录内的源码保持原样,仅通过根 CMakeLists.txt 编排构建 - **中文支持**:通过字体回退机制,英文用 LatoLatin,中文自动回退到等线(DengXian)