# nim_duilib **Repository Path**: bbatw/nim_duilib ## Basic Information - **Project Name**: nim_duilib - **Description**: No description available - **Primary Language**: C++ - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-01-20 - **Last Updated**: 2025-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # nim duilib [nim_duilib](https://github.com/rhett-lee/nim_duilib) 是一款基于C++开发的跨平台界面库,源于经典的 duilib 界面库并进行了深度优化与功能扩展,支持Windows/Linux/macOS/FreeBSD平台,专注于简化桌面应用的高效开发。其设计融合了DirectUI理念,通过XML描述界面布局,实现视觉与逻辑的分离,显著提升开发灵活性与维护性。  ## 核心技术特性 - XML布局驱动:采用 XML 文件定义界面结构,将界面布局与业务逻辑完全分离。开发者可通过修改 XML 快速调整控件位置、尺寸和样式,无需改动 C++ 核心代码,极大提升开发与迭代效率。 - 丰富的控件体系:内置按钮、文本框、列表视图、虚表控件、树形控件、滑块、进度条、菜单、颜色选择、属性页、标签页等基础控件,同时支持自定义控件开发,满足多样化界面设计需求。 - 高效的渲染机制:使用Skia作为渲染引擎,实现控件的无窗口绘制,减少系统资源占用,提升界面刷新速度。支持硬件加速渲染(后端绘制支持使用CPU绘制或者GPU绘制),确保复杂界面流畅运行。 - 事件驱动:基于消息机制的事件处理,使得UI交互逻辑清晰,支持在XML文件中配置事件响应代码。 - 多种图片格式:支持SVG/PNG/GIF/JPG/BMP/APNG/WEBP/ICO图片格式。 - 支持动画格式:支持GIF、APNG、WEBP、Lottie JSON、PAG动画文件格式。 - 多语言与国际化:支持动态多种语言切换,便于开发全球化的应用程序。 - 支持动态换肤:通过XML文件定义皮肤结构,可以轻松改变界面风格,支持动态换肤。 - 支持窗口阴影:支持窗口的圆角阴影、直角阴影,并可选择阴影大小,可实时更新。 - 支持DPI感知:有Unaware、SystemAware、PerMonitorAware、PerMonitorAware_V2四种模式,支持独立设置DPI,支持高清DPI的适配(仅限Windows平台)。 - 支持CEF控件:支持libcef 109 版本,以兼容Windows 7系统;支持libcef 142 版本,支持Windows 10及以上操作系统,支持Linux和MacOS平台。 - 支持WebView2控件:支持使用WebView2控件用于显示网页,其接口封装简单,更易于使用(仅支持Windows平台)。 - 支持SDL3:可使用SDL3作为窗口管理和输入输出等基本功能提供者,从而支持跨平台(目前已经适配了Windows/Linux/MacOS/FreeBSD平台)。 ## 目录结构 | 目录 | 说明 | | :--- | :--- | | duilib | 项目的源代码| | docs | 项目的说明文档,包括各个控件的功能介绍与属性列表说明文档| | bin | 各个示例程序输出目录,包含预设的皮肤和语言文件以及 CEF 依赖| | licenses | 引用的其他开源代码对应的licenses文件| | cmake | cmake编译时依赖的公共设置| | build | 各个平台的编译脚本和编译工程(包括VC编译工程)| | msvc | Windows平台的应用程序清单文件和VC工程公共配置| | examples | 项目的示例程序源代码,涵盖所有控件的基本用法示例| | duilib/third_party| 项目代码依赖的第三方库,详细内容见后续文档| ## 基于NIM_Duilib_Framework源码做的主要修改
| 分类 | 修改内容 |
|---|---|
| 整体改进 | 1. 调整了代码的组织结构,按照功能模块划分,大文件按类拆分为多个小文件,有利于理解整个库的体系结构 |
| 2. 梳理了代码的接口文件,补充各个接口的注释和功能注释,有利于阅读和理解代码 | |
| 3. 对配置XML文件进行优化,调整了属性命名规则,控件的宽度和高度可以按百分比设置,图片属性增加了部分扩展,优化了图片加载流程 | |
| 4. 扩展了图片资源的支持:新增加APNG/WEBP动画/Lottie JSON动画/PAG动画,新增对ICO的支持,并优化了图片加载引擎及代码实现逻辑 | |
| 5. 重新实现各个布局的代码,并新增了常见的界面布局方案,总体归类为:浮动布局、水平布局、垂直布局、水平流式布局、垂直流式布局、网格布局、水平瓦片布局、垂直瓦片布局、虚表水平布局、虚表垂直布局、虚表水平瓦片布局、虚表垂直瓦片布局,使布局的概念更易理解,易于扩展,详情可参考文档(docs/Box.md) | |
| 6. XML文件解析引擎替换为pugixml parser,性能更优 | |
| 7. 移除对base库的依赖,消息循环和线程通信相关功能改为自己实现 | |
| 8. 集成了Skia引擎,并作为默认的渲染引擎 | |
| 9. 支持SDL3,支持跨平台(已经适配了Windows平台、Linux平台、MacOS平台、FreeBSD平台) | |
| 10. CEF组件放到duilib工程,并对CEF的版本进行了升级(支持libcef 109 版本,以兼容Win7系统;支持libcef 142 版本,支持Win10及以上操作系统) | |
| 11. 重新设计图片管理的接口和加载流程(Image目录),支持多线程加载图片,以更好的扩展其他图片格式支持 | |
| 功能完善 | 1. 对窗口类(Window)增加了新的属性:的功能进行了完善,提高对DPI自适应、窗口消息的代码容错,代码结构做了调整 |
| 2. 对窗口类(Window)增加了新的属性:use_system_caption,snap_layout_menu,sys_menu,sys_menu_rect, icon属性,提供使用操作系统默认标题栏的选项,自绘标题栏的功能与系统标题栏的功能相似 | |
| 3. 对窗口(Window)引入WindowDropTarget辅助类,提供对基于窗口的拖放功能的支持 | |
| 4. 对资源管理相关的部分做了梳理,使得字体、颜色、图片等资源管理更容易理解 | |
| 5. 对ListBox控件进行了优化:细分为ListBox、VListBox、HListBox、VTileListBox、HTileListBox、VirtualListBox、VirtualVListBox、VirtualHListBox、VirtualVTileListBox、VirtualHTileListBox几种,功能更加完善,基于虚表的ListBox功能可用性提升 | |
| 6. 对组合框(Combo)关联的控件(CheckCombo、FilterCombo)进行了优化,提升可用性 | |
| 7. 对日期时间(DateTime)控件的编辑功能进行了完善 | |
| 8. 对菜单(CMenuWnd)类的功能代码进行优化,按新的结构重新实现菜单,使得菜单内的控件完全兼容现有容器/控件体系,易于理解和维护 | |
| 9. 对文本编辑控件(RichEdit)进行功能优化和扩展,丰富了较多常用功能 | |
| 10. 对树控件(TreeView)进行功能优化和扩展,丰富了较多常用功能,提升可用性 | |
| 11. 全局资源(GlobalManager)的接口进行了优化,使得所有资源全部通过此接口管理,易于理解和维护 | |
| 12. 同一个窗口内的不同容器之间,容器内的控件可以通过属性设置支持拖出和拖入操作 | |
| 13. 控件的背景色支持渐变色,新增前景色功能 | |
| 14. 完善了多国语言的功能,能够更好的支持多语言动态切换,并提供示例程序examples/MultiLang | |
| 15. 完善了DPI感知功能,支持Unaware、SystemAware、PerMonitorAware、PerMonitorAware_V2四种模式,支持独立设置DPI,支持高清DPI的适配,提供了示例程序examples/DpiAware | |
| 16. 移除了ui_components工程,CEF组件代码重新梳理,继承到duilib工程中,其他内容删除 | |
| 17. 优化窗口的阴影功能,窗口的阴影使用svg图片,增加了阴影类型属性(shadow_type),可选值为: "default", 默认阴影 "big", 大阴影,直角(适合普通窗口) "big_round", 大阴影,圆角(适合普通窗口) "small", 小阴影,直角(适合普通窗口) "small_round", 小阴影,圆角(适合普通窗口) "menu", 小阴影,直角(适合弹出式窗口,比如菜单等) "menu_round", 小阴影,圆角(适合弹出式窗口,比如菜单等) "none", 无阴影 | |
| 18. 新增对APNG/SVG/WEBP/ICO/LOTTIE/PAG图片格式的支持 | |
| 19. 重新设计控件的loading功能,使用Box容器展示loading功能,通过xml文件配置loading界面(包括动画图片),并支持与动画图片交互 | |
| 20. Label文本显示控件的功能加强:对文本齐方式新增加"两端对齐",新增对竖排文本的支持(文本绘制方向从上到下,从右到左),新增支持设置行间距和设置字间距 | |
| 新增控件 | 1. GroupBox:分组容器 |
| 2. HotKey:热键控件 | |
| 3. HyperLink:带有超级链接的文字 | |
| 4. IPAddress:IP地址控件 | |
| 5. Line:画线控件 | |
| 6. RichText:格式化文本(类HTML格式) | |
| 7. Split: 分割条控件/容器 | |
| 8. TabCtrl:多标签控件(类似浏览器的多标签) | |
| 9. ListCtrl:列表控件(Report/Icon/List三个视图) | |
| 10. PropertyGrid: 属性表控件,支持文本、数字、复选框、字体、颜色、日期、IP地址、热键、文件路径、文件夹等属性 | |
| 11. ColorPicker:拾色器,独立窗口,其中的子控件,可以单独作为颜色控件来使用 | |
| 12. ComboButton:带有下拉组合框的按钮 | |
| 13. ShadowWnd:是WinImplBase的子类,使用附加阴影窗口实现的基类,实现了创建窗口并附加的功能,提供没有 kWS_EX_LAYERED 属性的窗口阴影 | |
| 14. ControlDragableT:支持相同Box内的子控件通过拖动来调整顺序 | |
| 15. DirectoryTree:目录树控件,用于显示文件系统中的目录 | |
| 16. AddressBar:地址栏控件,用于显示本地文件系统的路径 | |
| 17. WebView2Control:封装了WebView2控件的基本功能 | |
| 18. GridBox/GridScrollBox:基于网格布局的控件 | |
| 19. HFlowBox/VFlowBox/HFlowScrollBox/VFlowScrollBox:基于水平流式布局和垂直流式布局的控件 | |
| 性能优化 | 1. 优化了Control及子控件的内存占用,在界面元素较多的时候,内存占有率有大幅降低 |
| 2. 优化了动画绘制流程,合并定时器的触发事件,避免播放控件动画或者播放动画图片的过程中导致界面很卡的现象 | |
| 3. 基于虚表的ListBox控件及关联控件:通过优化实现机制,使得可用性和性能有较大改善 | |
| 示例程序完善 | 1. examples/ColorPicker: 新增加了拾色器示例程序 |
| 2. examples/ListCtrl:新增加了列表的示例程序,演示列表的个性功能 | |
| 3. examples/render:新增加了渲染引擎示例程序,演示了大部分容器、控件、资源管理的功能 | |
| 4. examples/TreeView:新增加了树控件的示例程序,演示了树控件的各种功能 | |
| 5. examples/RichEdit:新增加了富文本编辑控件的示例程序,演示了富文本编辑控件的各种功能 | |
| 6. examples/MultiLang:提供多语言的动态切换功能演示 | |
| 7. examples/DpiAware:提供了DPI感知功能的功能演示 | |
| 8. examples/threads:提供了多线程的功能演示 | |
| 9. examples/WebView2:提供了WebView2控件的功能演示 | |
| 10. examples/WebView2Browser:提供了WebView2控件的功能演示(多标签) | |
| 11. examples/layout:所有布局和容器的功能演示 | |
| 12. 其他的示例程序:大部分进行了代码兼容性修改和优化,使得示例程序也可以当作测试程序使用 | |
| 完善文档 | 1. README.md和docs子目录的文档重新进行了梳理,使得阅读者更容易理解界面库的功能、用法,更易上手 |
| 2. 各个控件的接口没有单独整理成文档,因为可以直接阅读接口文件中的注释来达到目的,目前各个接口的注释是比较完善的 | |
| 3. 各个平台的编译文档和依赖的编译脚本 | |
| 4. 重新整理主体项目、依赖第三方源码的授权文件,统一放在licenses目录中管理 |