{"id":48643915,"url":"https://github.com/rhett-lee/nim_duilib","last_synced_at":"2026-04-25T18:00:41.541Z","repository":{"id":239136154,"uuid":"796462843","full_name":"rhett-lee/nim_duilib","owner":"rhett-lee","description":"duilib界面库的改进版，支持Windows/Linux/MacOS平台（基于SDL3），支持Skia渲染引擎（支持CPU/GPU），支持DPI感知，多语言动态切换，支持SVG, PNG, GIF, JPG, BMP, APNG, WEBP, ICO图片，支持GIF/WebP/APNG动画。","archived":false,"fork":false,"pushed_at":"2026-04-18T13:25:44.000Z","size":171434,"stargazers_count":295,"open_issues_count":7,"forks_count":73,"subscribers_count":8,"default_branch":"main","last_synced_at":"2026-04-18T15:28:58.963Z","etag":null,"topics":["c-plusplus","duilib","gui","linux","macos","qt","sdl3","ui","win32-cpp","win32gui","windows"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rhett-lee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-05-06T01:38:09.000Z","updated_at":"2026-04-18T05:10:38.000Z","dependencies_parsed_at":"2025-06-12T06:23:14.245Z","dependency_job_id":"222f8e93-06a7-413f-a285-9ea515243f95","html_url":"https://github.com/rhett-lee/nim_duilib","commit_stats":null,"previous_names":["rhett-lee/nim_duilib"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/rhett-lee/nim_duilib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhett-lee%2Fnim_duilib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhett-lee%2Fnim_duilib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhett-lee%2Fnim_duilib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhett-lee%2Fnim_duilib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rhett-lee","download_url":"https://codeload.github.com/rhett-lee/nim_duilib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhett-lee%2Fnim_duilib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32271243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-plusplus","duilib","gui","linux","macos","qt","sdl3","ui","win32-cpp","win32gui","windows"],"created_at":"2026-04-10T00:00:41.116Z","updated_at":"2026-04-25T18:00:41.533Z","avatar_url":"https://github.com/rhett-lee.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"# nim_duilib\n\n[nim_duilib](https://github.com/rhett-lee/nim_duilib) 是一款基于C++开发的跨平台界面库，源于经典的 duilib 界面库并进行了深度优化与功能扩展，支持Windows/Linux/macOS/FreeBSD平台，支持的Linux系统包括OpenEuler、OpenKylin、UbuntuKylin、统信UOS、中科方德、Ubuntu、Fedora、Debian等，专注于简化桌面应用的高效开发。其设计融合了DirectUI理念，通过XML描述界面布局，实现视觉与逻辑的分离，显著提升开发灵活性与维护性。\n\n![GitHub](https://img.shields.io/badge/license-MIT-green.svg)\n\n## 核心技术特性\n\n - XML布局驱动：采用 XML 文件定义界面结构，将界面布局与业务逻辑完全分离。开发者可通过修改 XML 快速调整控件位置、尺寸和样式，无需改动 C++ 核心代码，极大提升开发与迭代效率。\n - 丰富的控件体系：内置按钮、文本框、列表视图、虚表控件、树形控件、滑块、进度条、菜单、颜色选择、属性页、标签页等基础控件，同时支持自定义控件开发，满足多样化界面设计需求。\n - 高效的渲染机制：使用Skia作为渲染引擎，实现控件的无窗口绘制，减少系统资源占用，提升界面刷新速度。支持硬件加速渲染（后端绘制支持使用CPU绘制或者GPU绘制），确保复杂界面流畅运行。\n - 事件驱动：基于消息机制的事件处理，使得UI交互逻辑清晰，支持在XML文件中配置事件响应代码。\n - 多种图片格式：支持SVG/PNG/GIF/JPG/BMP/APNG/WEBP/ICO图片格式。\n - 支持动画格式：支持GIF、APNG、WEBP、Lottie JSON、PAG动画文件格式。\n - 多语言与国际化：支持动态多种语言切换，便于开发全球化的应用程序。\n - 支持动态换肤：通过XML文件定义皮肤结构，可以轻松改变界面风格，支持动态换肤。\n - 支持窗口阴影：支持窗口的圆角阴影、直角阴影，并可选择阴影大小，可实时更新。\n - 支持DPI感知：有Unaware、SystemAware、PerMonitorAware、PerMonitorAware_V2四种模式，支持独立设置DPI，支持高清DPI的适配（仅限Windows平台）。\n - 支持CEF控件：支持libcef 109 版本，以兼容Windows 7系统；支持libcef 142 版本，支持Windows 10及以上操作系统，支持Linux和MacOS平台。\n - 支持WebView2控件：支持使用WebView2控件用于显示网页，其接口封装简单，更易于使用（仅支持Windows平台）。\n - 支持SDL3：可使用SDL3作为窗口管理和输入输出等基本功能提供者，从而支持跨平台（目前已经适配了Windows/Linux/MacOS/FreeBSD平台）。\n\n## 目录结构\n| 目录          | 说明 |\n| :---          | :--- |\n| duilib        | 项目的源代码|\n| docs          | 项目的说明文档，包括各个控件的功能介绍与属性列表说明文档|\n| bin           | 各个示例程序输出目录，包含预设的皮肤和语言文件以及 CEF 依赖|\n| licenses      | 引用的其他开源代码对应的licenses文件|\n| cmake         | cmake编译时依赖的公共设置|\n| build         | 各个平台的编译脚本和编译工程（包括VC编译工程）|\n| msvc          | Windows平台的应用程序清单文件和VC工程公共配置|\n| examples      | 项目的示例程序源代码，涵盖所有控件的基本用法示例|\n| duilib/third_party| 项目代码依赖的第三方库，详细内容见后续文档|\n\n## 基于NIM_Duilib_Framework源码做的主要修改\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003cth\u003e分类\u003c/th\u003e\n        \u003cth\u003e修改内容\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"11\"\u003e整体改进\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. 调整了代码的组织结构，按照功能模块划分，大文件按类拆分为多个小文件，有利于理解整个库的体系结构\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. 梳理了代码的接口文件，补充各个接口的注释和功能注释，有利于阅读和理解代码\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. 对配置XML文件进行优化，调整了属性命名规则，控件的宽度和高度可以按百分比设置，图片属性增加了部分扩展，优化了图片加载流程\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e4. 扩展了图片资源的支持：新增加APNG/WEBP动画/Lottie JSON动画/PAG动画，新增对ICO的支持，并优化了图片加载引擎及代码实现逻辑\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e5. 重新实现各个布局的代码，并新增了常见的界面布局方案，总体归类为：浮动布局、水平布局、垂直布局、水平流式布局、垂直流式布局、网格布局、水平瓦片布局、垂直瓦片布局、虚表水平布局、虚表垂直布局、虚表水平瓦片布局、虚表垂直瓦片布局，使布局的概念更易理解，易于扩展，详情可参考文档(docs/Box.md)\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e6. XML文件解析引擎替换为pugixml parser，性能更优\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e7. 移除对base库的依赖，消息循环和线程通信相关功能改为自己实现\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e8. 集成了Skia引擎，并作为默认的渲染引擎\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e9. 支持SDL3，支持跨平台（已经适配了Windows平台、Linux平台、MacOS平台、FreeBSD平台）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e10. CEF组件放到duilib工程，并对CEF的版本进行了升级（支持libcef 109 版本，以兼容Win7系统；支持libcef 142 版本，支持Win10及以上操作系统）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e11. 重新设计图片管理的接口和加载流程（Image目录），支持多线程加载图片，以更好的扩展其他图片格式支持\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"22\"\u003e功能完善\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. 对窗口类（Window）增加了新的属性：的功能进行了完善，提高对DPI自适应、窗口消息的代码容错，代码结构做了调整\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. 对窗口类（Window）增加了新的属性：use_system_caption，snap_layout_menu，sys_menu，sys_menu_rect, icon属性，提供使用操作系统默认标题栏的选项，自绘标题栏的功能与系统标题栏的功能相似\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. 对窗口（Window）引入WindowDropTarget辅助类，提供对基于窗口的拖放功能的支持\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e4. 对资源管理相关的部分做了梳理，使得字体、颜色、图片等资源管理更容易理解\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e5. 对ListBox控件进行了优化：细分为ListBox、VListBox、HListBox、VTileListBox、HTileListBox、VirtualListBox、VirtualVListBox、VirtualHListBox、VirtualVTileListBox、VirtualHTileListBox几种，功能更加完善，基于虚表的ListBox功能可用性提升\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e6. 对组合框（Combo）关联的控件（CheckCombo、FilterCombo）进行了优化，提升可用性\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e7. 对日期时间（DateTime）控件的编辑功能进行了完善\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e8. 对菜单（CMenuWnd）类的功能代码进行优化，按新的结构重新实现菜单，使得菜单内的控件完全兼容现有容器/控件体系，易于理解和维护\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e9. 对文本编辑控件（RichEdit）进行功能优化和扩展，丰富了较多常用功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e10. 对树控件（TreeView）进行功能优化和扩展，丰富了较多常用功能，提升可用性\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e11. 全局资源（GlobalManager）的接口进行了优化，使得所有资源全部通过此接口管理，易于理解和维护\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e12. 同一个窗口内的不同容器之间，容器内的控件可以通过属性设置支持拖出和拖入操作\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e13. 控件的背景色支持渐变色，新增前景色功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e14. 完善了多国语言的功能，能够更好的支持多语言动态切换，并提供示例程序examples/MultiLang\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e15. 完善了DPI感知功能，支持Unaware、SystemAware、PerMonitorAware、PerMonitorAware_V2四种模式，支持独立设置DPI，支持高清DPI的适配，提供了示例程序examples/DpiAware\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e16. 移除了ui_components工程，CEF组件代码重新梳理，继承到duilib工程中，其他内容删除\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e17. 优化窗口的阴影功能，窗口的阴影使用svg图片，增加了阴影类型属性（shadow_type），可选值为：\u003cbr\u003e \"default\", 默认阴影 \u003cbr\u003e \"big\", 大阴影，直角（适合普通窗口）\u003cbr\u003e \"big_round\", 大阴影，圆角（适合普通窗口）\u003cbr\u003e \"small\", 小阴影，直角（适合普通窗口）\u003cbr\u003e \"small_round\", 小阴影，圆角（适合普通窗口）\u003cbr\u003e \"menu\", 小阴影，直角（适合弹出式窗口，比如菜单等）\u003cbr\u003e \"menu_round\", 小阴影，圆角（适合弹出式窗口，比如菜单等）\u003cbr\u003e \"none\", 无阴影\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e18. 新增对APNG/SVG/WEBP/ICO/LOTTIE/PAG图片格式的支持\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e19. 重新设计控件的loading功能，使用Box容器展示loading功能，通过xml文件配置loading界面（包括动画图片），并支持与动画图片交互\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e20. Label文本显示控件的功能加强：对文本齐方式新增加\"两端对齐\"，新增对竖排文本的支持（文本绘制方向从上到下，从右到左），新增支持设置行间距和设置字间距\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e21. Control控件支持全屏显示（通过调用新增加的Window::SetFullscreenControl函数实现该功能），CEF控件和WebView2控件支持F11切换页面全屏\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e22. 完善控件动画的功能细节，并引入缓动函数，支持设置控件动画的属性，比如设置缓动函数类型，设置动画总时长和播放间隔等\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"25\"\u003e新增控件/新增容器\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. GroupBox：分组容器\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. HotKey：热键控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. HyperLink：带有超级链接的文字\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e4. IPAddress：IP地址控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e5. Line：画线控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e6. RichText：格式化文本（类HTML格式）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e7. Split: 分割条控件/容器\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e8. TabCtrl：多标签控件（类似浏览器的多标签）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e9. ListCtrl：列表控件（Report/Icon/List三个视图）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e10. PropertyGrid: 属性表控件，支持文本、数字、复选框、字体、颜色、日期、IP地址、热键、文件路径、文件夹等属性\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e11. ColorPicker：拾色器，独立窗口，其中的子控件，可以单独作为颜色控件来使用\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e12. ComboButton：带有下拉组合框的按钮\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e13. ShadowWnd：是WinImplBase的子类，使用附加阴影窗口实现的基类，实现了创建窗口并附加的功能，提供没有 kWS_EX_LAYERED 属性的窗口阴影\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e14. DirectoryTree：目录树控件，用于显示文件系统中的目录\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e15. AddressBar：地址栏控件，用于显示本地文件系统的路径\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e16. WebView2Control：封装了WebView2控件的基本功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e17. GridBox/GridScrollBox：基于网格布局的控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e18. HFlowBox/VFlowBox/HFlowScrollBox/VFlowScrollBox：基于水平流式布局和垂直流式布局的控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e19. MenuBar：菜单栏控件\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e20. IconControl/BitmapControl：用户显示基于内存的小图标和位图数据\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e21. ChildWindow：子窗口控件，Windows平台的实现为系统原生子窗口（带有WS_CHILD属性）；其他平台为SDL的弹出式窗口，非原生子窗口，SDL不支持原生子窗口\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e22. ControlDragableT(模板类，包含以下四个标准控件：ControlDragable/BoxDragable/HBoxDragable/VBoxDragable)：支持相同Box内的子控件通过拖动来调整顺序，支持在不同的Box内通过拖动来调整控件所属容器\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e23. ControlMovableT(模板类，包含以下四个标准控件：ControlMovable/BoxMovable/HBoxMovable/VBoxMovable)：支持通过鼠标拖动来调整控件的位置，也支持通过鼠标拖动来调整父容器的位置\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e24. ControlResizableT(模板类，包含以下四个标准控件：ControlResizable/BoxResizable/HBoxResizable/VBoxResizable)：支持通过鼠标拖动来调整控件的大小，功能与调整窗口大小的功能相似\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e25. XmlBox：支持加载并预览界面库的XML文件的容器，可以用于预览XML文件中定义的控件显示效果\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"3\"\u003e性能优化\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. 优化了Control及子控件的内存占用，在界面元素较多的时候，内存占有率有大幅降低\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. 优化了动画绘制流程，合并定时器的触发事件，避免播放控件动画或者播放动画图片的过程中导致界面很卡的现象\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. 基于虚表的ListBox控件及关联控件：通过优化实现机制，使得可用性和性能有较大改善\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"14\"\u003e示例程序完善\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. examples/ColorPicker: 新增加了拾色器示例程序\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. examples/ListCtrl：新增加了列表的示例程序，演示列表的个性功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. examples/render：新增加了渲染引擎示例程序，演示了大部分容器、控件、资源管理的功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e4. examples/TreeView：新增加了树控件的示例程序，演示了树控件的各种功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e5. examples/RichEdit：新增加了富文本编辑控件的示例程序，演示了富文本编辑控件的各种功能\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e6. examples/MultiLang：提供多语言的动态切换功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e7. examples/DpiAware：提供了DPI感知功能的功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e8. examples/threads：提供了多线程的功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e9. examples/WebView2：提供了WebView2控件的功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e10. examples/WebView2Browser：提供了WebView2控件的功能演示（多标签）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e11. examples/layout：所有布局和容器的功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e12. examples/ChildWindow：子窗口控件的功能演示\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e12. examples/XmlPreview：XML文件的界面效果预览功能测试（测试XmlBox容器）\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e14. 其他的示例程序：大部分进行了代码兼容性修改和优化，使得示例程序也可以当作测试程序使用\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd rowspan=\"8\"\u003e完善文档\u003c/td\u003e\n        \u003ctd align=\"left\"\u003e1. README.md和docs子目录的文档重新进行了梳理，使得阅读者更容易理解界面库的功能、用法，更易上手\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e2. 各个控件的接口没有单独整理成文档，因为可以直接阅读接口文件中的注释来达到目的，目前各个接口的注释是比较完善的\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e3. 各个平台的编译文档和依赖的编译脚本\u003c/td\u003e\u003c/tr\u003e\n    \u003ctr\u003e\u003ctd align=\"left\"\u003e4. 重新整理主体项目、依赖第三方源码的授权文件，统一放在licenses目录中管理\u003c/td\u003e\u003c/tr\u003e\n\u003c/table\u003e\n\n## 使用的第三方库说明\n| 名称     |代码子目录                 | 用途                                 | license文件        | 协议分类          |\n| :---     | :---                      |:---                                  |:---               |:---               |\n|apng      |duilib/third_party/libpng  | 支持APNG图片格式                     |zlib/libpng License|zlib/libpng 许可协议，宽松型开源协议|\n|libpng    |duilib/third_party/libpng  | 支持PNG图片格式                      |[libpng.LICENSE.txt](licenses/libpng.LICENSE.txt)|自定义的 BSD 风格宽松协议|\n|zlib      |duilib/third_party/zlib    | 支持PNG/APNG图片格式\u003cbr\u003eZip文件解压  |[zlib.LICENSE.txt](licenses/zlib.LICENSE.txt)|zlib许可协议，宽松型开源协议|\n|cximage   |duilib/third_party/cximage | 支持ICO图片格式                      |[cximage.LICENSE.txt](licenses/cximage.LICENSE.txt)|MIT 风格协议（非标准 MIT 协议）|\n|giflib    |duilib/third_party/giflib  | 支持GIF图片格式                      |[giflib.LICENSE.txt](licenses/giflib.LICENSE.txt)|MIT 许可协议|\n|libwebp   |duilib/third_party/libwebp | 支持WebP图片格式                     |[libWebP.LICENSE.txt](licenses/libwebp.LICENSE.txt)|BSD 3条款许可协议|\n|stb_image |duilib/third_party/stb_image| 支持BMP图片格式\u003cbr\u003e调整图片大小     |[stb_image.LICENSE.txt](licenses/stb_image.LICENSE.txt)|MIT 许可协议/公有领域协议|\n|libjpeg-turbo|duilib/third_party/libjpeg-turbo| 支持JPEG图片格式             |[libjpeg-turbo.LICENSE.md](licenses/libjpeg-turbo.LICENSE.md)|IJG 许可证和修改后的BSD 3条款许可协议|\n|nanosvg   |duilib/third_party/svg      | 支持SVG图片格式                     |[nanosvg.LICENSE.txt](licenses/nanosvg.LICENSE.txt)|zlib 许可协议|\n|pugixml   |duilib/third_party/xml      | 支持资源描述XML的解析               |[pugixml.LICENSE.txt](licenses/pugixml.LICENSE.txt)|MIT 许可协议|\n|ConvertUTF|duilib/third_party/convert_utf| 用于UTF-8/UTF-16编码转换         |[llvm.LICENSE.txt](licenses/llvm.LICENSE.txt)|Apache License Version 2.0 为主，\u003cbr\u003eLLVM 例外条款补充，\u003cbr\u003e历史版本兼容 legacy 协议|\n|skia      |项目未包含skia源码          | 界面库渲染引擎\u003cbr\u003e支持SVG图片格式\u003cbr\u003e支持Lottie JSON动画|[skia.LICENSE.txt](licenses/skia.LICENSE.txt)|BSD 3条款许可协议|\n|SDL       |项目未包含SDL源码           | 跨平台窗口管理                     |[SDL.LICENSE.txt](licenses/SDL.LICENSE.txt)|zlib 许可协议|\n|duilib    |                            | NIM_Duilib_Framework\u003cbr\u003e是基于duilib开发  |[duilib.LICENSE.txt](licenses/duilib.LICENSE.txt)|BSD 2条款许可协议|\n|NIM_Duilib\u003cbr\u003eFramework|               | 本项目是基于\u003cbr\u003eNIM_Duilib_Framework开发   |[NIM_Duilib_Framework.LICENSE.txt](licenses/NIM_Duilib_Framework.LICENSE.txt)|MIT 许可协议|\n|libcef    |duilib/third_party/libcef   | 用于加载CEF模块|[libcef.LICENSE.txt](licenses/libcef.LICENSE.txt)|BSD 3条款许可协议|\n|udis86    |duilib/third_party/libudis86| 反汇编计算完整性指令最短长度         |[udis86.LICENSE.txt](licenses/udis86.LICENSE.txt)|BSD 2条款许可协议|\n|WebView2  |duilib/third_party/\u003cbr\u003eMicrosoft.Web.WebView2| 支持WebView2控件 |[Microsoft.Web.WebView2.LICENSE.txt](licenses/Microsoft.Web.WebView2.LICENSE.txt)|BSD 3条款许可协议|\n|libpag    |duilib/third_party/libpag   | 支持PAG动画文件\u003cbr\u003e（该功能默认未启用，详见后续文档） |[libpag.LICENSE.txt](licenses/libpag.LICENSE.txt)|Apache License Version 2.0(主体)\u003cbr\u003elibpag依赖的第三方组件的\u003cbr\u003e授权协议很多，详见目录:\u003cbr\u003e`duilib/third_party/libpag/licenses`\u003cbr\u003e中的文件。如果介意libpag的授权协议\u003cbr\u003e（包括主体协议/第三方组件协议），\u003cbr\u003e可以不启用libpag。|\n\n## 界面效果预览\n使用该界面库编写的示例程序，该文档可以见到各个控件的展示效果：[docs/Examples.md](docs/Examples.md) \n\n## 关于PAG动画文件格式\n* 目前PAG动画文件格式仅在Window平台支持，其他平台暂未支持\n* 支持PAG动画文件格式功能默认关闭（因为需要自己编译libpag.lib和libpag.dll，放进项目才能正常编译运行）\n* 支持PAG动画格式的开启方法：    \n（1）使用文本编译器打开[`msvc/PropertySheets/LibPagSettings.props`](msvc/PropertySheets/LibPagSettings.props)文件，将`LibPagEnabled`变量的支持修改为`1`    \n（2）参照以下文档编译libpag库：[`duilib/third_party/libpag/windows/libpag-build.md`](duilib/third_party/libpag/windows/libpag-build.md)     \n* 编译nim_duilib的时候，需要使用`build/duilib.sln`或者`build/examples.sln`编译，其他方式编译不支持。\n* libpag库的主体授权协议为Apache License Version 2.0，其依赖的第三方组件的授权协议很多，\u003cbr\u003e详见目录:`duilib/third_party/libpag/licenses`中的文件。\u003cbr\u003e如果介意libpag的授权协议（包括主体协议/第三方组件协议），可以不启用libpag。\n\n## 编程语言\n- C/C++: 编译器需要支持C++20（`main`分支）\n- C/C++: 编译器需要支持C++17（`develop-cpp17`分支，该分支仅用于支持Windows系统的VS2017/VS2019编译器，其他环境请使用主分支）\n\n## 支持的操作系统\n- Windows：7/10/11 及以上\n- Linux：OpenEuler、OpenKylin（开放麒麟）、UbuntuKylin（优麒麟）、中科方德、统信UOS、Ubuntu、Debian、Fedora、OpenSuse等\n- macOS：12+\n- FreeBSD\n\n## 支持的编译器\n- Visual Studio 2022/2026（Windows）\n- Visual Studio 2017/2019（Windows，这两个版本的编译器仅在`develop-cpp17`分支代码支持，其他分支代码均不支持；使用VS2017时，不支持CEF模块）\n- LLVM（Windows）\n- MinGW-W64：gcc/g++、clang/clang++（Windows）\n- gcc/g++（Linux）\n- clang/clang++（Linux）\n- clang/clang++（macOS）\n- clang/clang++（FreeBSD）\n\n## A. 编译过程（Windows平台）\n### 一、准备工作：安装必备的软件\n1. 安装python3（python的主版本需要是3，需要添加到Path环境变量）    \n（1）首先安装python3    \n（2）到`python.exe`所在目录中，复制一份`python.exe`，改名为`python3.exe`: 确保命令行参数中可以访问到`python3.exe`   \n（3）在命令行验证：`\u003e python3.exe --version` 可以查看python的版本号     \n2. 安装Git For Windows: 2.44版本（其他版本也可以），git需要添加到Path环境变量，确保命令行参数中可以访问到`git.exe`    \n3. 安装Visual Studio，安装过程中注意同时选择安装正确的Windows SDK版本    \n   推荐安装Windows 11 SDK，因为CEF模块需要依赖Windows 11 SDK，Windows 10 SDK会导致CEF相关模块编译不过；    \n   如果不使用CEF功能，使用Windows 10 SDK也可以\n4. 安装LLVM：21.1.4 Win64 版本（其他版本也可以）    \n（1）安装目录：`C:\\LLVM`    \n（2）注意事项：如果安装在其他目录，安装目录中不能有空格，否则编译会遇到问题。\n\n### 二、使用脚本自动编译（推荐）\n该脚本自动完成相关源码下载和编译工作。    \n选定一个工作目录（注意事项：路径中不能包含空格，否则编译脚本会出错），创建一个脚本`build.bat`，将下面已经整理好脚本复制进去，保存文件。    \n* 对于Visual Studio 2022/2026，脚本文件内容如下：    \n```\nREM For Visual Studio 2022/2026\necho OFF\nset retry_delay=10\n\n:retry_clone_duilib\nif not exist \".\\nim_duilib\\.git\" (\n    git clone https://github.com/rhett-lee/nim_duilib\n) else (  \n    git -C ./nim_duilib pull\n)\nif %errorlevel% neq 0 (\n    timeout /t %retry_delay% \u003enul\n    goto retry_clone_duilib\n)\nif not exist \".\\nim_duilib\\.git\" (\n    echo clone duilib failed!\n    exit /b 1\n)\n.\\nim_duilib\\build\\build_duilib_all_in_one.bat\n```\n上述脚本默认编译使用的是静态运行库(MT和MTd)，如果需要使用动态运行库（MD和MDd），需要将上述脚本的最后一行追加`/MD`参数，改为：    \n`.\\nim_duilib\\build\\build_duilib_all_in_one.bat /MD`    \n备注1：如果nim_duilib最终编译为DLL库，那么就必须使用动态运行库。    \n备注2：如果nim_duilib使用动态运行库，那么Skia库也必须使用动态运行库，编译方法可参考skia_compile库的文档。    \n    \n* 对于Visual Studio 2017/2019（需要使用develop-cpp17分支代码），脚本文件内容如下：    \n```\nREM For Visual Studio 2017/2019\necho OFF\nset retry_delay=10\n\n:retry_clone_duilib\nif not exist \".\\nim_duilib\\.git\" (\n    git clone https://github.com/rhett-lee/nim_duilib\n) else (  \n    git -C ./nim_duilib pull\n)\nif %errorlevel% neq 0 (\n    timeout /t %retry_delay% \u003enul\n    goto retry_clone_duilib\n)\nif not exist \".\\nim_duilib\\.git\" (\n    echo clone duilib failed!\n    exit /b 1\n)\n\n:retry_pull_duilib\ngit -C ./nim_duilib checkout develop-cpp17\ngit -C ./nim_duilib pull\nif %errorlevel% neq 0 (\n    timeout /t %retry_delay% \u003enul\n    goto retry_pull_duilib\n)\n.\\nim_duilib\\build\\build_duilib_all_in_one.bat\n```\n上述脚本默认编译使用的是静态运行库(MT和MTd)，如果需要使用动态运行库（MD和MDd），需要将上述脚本的最后一行追加`/MD`参数，改为：    \n`.\\nim_duilib\\build\\build_duilib_all_in_one.bat /MD`    \n备注1：如果nim_duilib最终编译为DLL库，那么就必须使用动态运行库。    \n备注2：如果nim_duilib使用动态运行库，那么Skia库也必须使用动态运行库，编译方法可参考skia_compile库的文档。    \n    \n* 脚本文件准备好以后，进入命令行控制台，运行该脚本： \n```\n.\\build.bat\n```\n编译完成的示例程序位于bin目录中。\n\n### 三、手动编译过程（Windows平台）\n1. 设置工作目录：`D:\\develop`    \n2. 获取相关代码    \n（1）`git clone https://github.com/rhett-lee/nim_duilib`      \n（2）`git clone https://github.com/rhett-lee/skia_compile`    \n（3）`git clone https://github.com/google/skia.git`  \n3. 编译Skia源码    \n（1）nim_duilib内部使用Skia作为界面绘制引擎，所以先要编译skia，优先用LLVM编译，运行流畅    \n（2）按照skia_compile目录中的[Windows下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/Windows%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)文档中的方法，编译出skia相关的.lib文件      \n4. 如果使用的是Visual Studio 2017/2019，需要使用develop-cpp17分支代码，需要在命令运行以下命令：    \n   `git -C ./nim_duilib checkout develop-cpp17`\n5. 编译nim_duilib：进入 `build` 目录，打开 `examples.sln`（如果使用的是Visual Studio 2017，需要打开`examples_vs2017.sln`），可执行编译，编译完成的示例程序位于bin目录中。\n6. CEF模块的备注：    \n（1）CEF模块依赖Windows 11 SDK，如果是低版本SDK，会有编译错误。    \n（2）CEF模块仅支持Visual Studio 2019/2022/2026，不支持Visual Studio 2017。    \n（3）CEF模块如果不需要可关闭，编辑`msvc\\PropertySheets\\CEFSettings.props`文件，将`LibCefEnabled`的值改为`0`即可。    \n（4）关闭CEF模块后，可使用`duilib_no_cef.sln`或者`examples_no_cef.sln`工程来编译，从而减少libCEF代码的编译。    \n7. WebView2模块的备注：    \n（1）WebView2模块如果不需要可关闭，编辑`msvc\\PropertySheets\\WebView2Settings.props`文件，将`WebView2Enabled`的值改为`0`即可。    \n8. nim_duilib库默认使用静态运行库（/MT和/MTd），同时也支持动态运行库（/MD和/MDd），切换方法如下：    \n（1）Skia库编译时使用的运行库，与nim_duilib库使用的运行库必须相同。Skia库的编译方法可参考skia_compile库的文档。    \n（2）nim_duilib库切换为使用动态运行库，可运行以下脚本：    \n    `.\\nim_duilib\\msvc\\PropertySheets\\DuilibUseDynamicRuntime.bat`    \n（3）nim_duilib库切换为使用静态运行库，可运行以下脚本：    \n    `.\\nim_duilib\\msvc\\PropertySheets\\DuilibUseStaticRuntime.bat`    \n\n## B. 编译过程（Linux平台）\n### 一、准备工作：安装必备的软件\n不同的操作系统平台，可以按照以下列表安装必备的软件。\n| 操作系统平台            |桌面类型        |需要安装的模块及安装命令（必选） | \n| :---                    | :---           | :---                    |\n|OpenEuler                |UKUI/DDE（X11） |`sudo dnf install -y gcc g++ gdb make git ninja-build gn python cmake llvm clang unzip fontconfig-devel mesa-libGL-devel mesa-libGLU-devel mesa-libGLES-devel mesa-libEGL-devel vulkan-devel libXext-devel libXcursor-devel libXi-devel libXrandr-devel dbus-devel ibus-devel`| \n|OpenKylin（开放麒麟）    | Wayland        |`sudo apt install -y gcc g++ gdb make git ninja-build generate-ninja python3 cmake llvm clang unzip libfontconfig-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-dev libxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev libwayland-dev libxkbcommon-dev`| \n|UbuntuKylin（优麒麟）    | X11            |`sudo apt install -y gcc g++ gdb make git ninja-build generate-ninja python3 cmake llvm clang unzip libfontconfig-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-devlibxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev`| \n|中科方德                 | X11            |`sudo apt install -y gcc g++ gdb make git ninja-build generate-ninja python3 cmake llvm clang unzip libfontconfig-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-dev libxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev`| \n|统信UOS                  | X11            |`sudo apt install -y gcc g++ gdb make git cmake python3 ninja-build wget unzip libfontconfig1-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-dev libxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev`| \n|Ubuntu                   |GNOME（Wayland）|`sudo apt install -y gcc g++ gdb make git ninja-build generate-ninja python3 cmake llvm clang unzip bzip2 libfontconfig-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-dev libxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev libwayland-dev libxkbcommon-dev`| \n|Debian                   |GNOME（Wayland）|`sudo apt install -y gcc g++ gdb make git ninja-build generate-ninja python3 cmake llvm clang unzip libfontconfig-dev libgl1-mesa-dev libgles2-mesa-dev libegl1-mesa-dev libvulkan-dev libxext-dev libxcursor-dev libxi-dev libxrandr-dev libdbus-1-dev libibus-1.0-dev libwayland-dev libxkbcommon-dev`| \n|Fedora                   |GNOME（Wayland）|`sudo dnf install -y gcc g++ gdb make git ninja-build gn python cmake llvm clang unzip fontconfig-devel mesa-libGL-devel mesa-libGLU-devel mesa-libGLES-devel mesa-libEGL-devel vulkan-devel libXext-devel libXcursor-devel libXi-devel libXrandr-devel dbus-devel ibus-devel wayland-devel libxkbcommon-devel`|\n|OpenSuse                 |KDE（X11）      |`sudo zypper install -y gcc gcc-c++ gdb make git ninja gn python cmake llvm clang unzip fontconfig-devel Mesa-libGL-devel Mesa-libEGL-devel Mesa-libGLESv3-devel glu-devel vulkan-devel libXext-devel libXcursor-devel libXi-devel libXrandr-devel dbus-1-devel ibus-devel`|\n\n### 二、使用脚本自动编译（推荐）\n该脚本自动完成相关源码下载和编译工作。    \n选定一个工作目录（注意事项：路径中不能包含空格，否则编译脚本会出错），创建一个脚本`build.sh`，将下面已经整理好脚本复制进去，保存文件。    \n然后在控制台，为脚本文件添加可执行权限，最后运行该脚本： \n```\nchmod +x build.sh\n./build.sh\n```\n\n脚本文件内容如下：    \n```\n#!/bin/bash\n\n# Retry clone nim_duilib\nwhile true; do\n    if [ ! -d \"./nim_duilib/.git\" ]; then\n        git clone https://github.com/rhett-lee/nim_duilib\n    else\n        git -C ./nim_duilib pull\n    fi\n    if [ $? -ne 0 ]; then\n        sleep 10\n        continue\n    fi\n    break\ndone\n\nchmod +x ./nim_duilib/build/build_duilib_all_in_one.sh\n./nim_duilib/build/build_duilib_all_in_one.sh\n```\n编译完成的示例程序位于bin目录中。    \n备注：UOS系统，需要先安装所需的开发环境，然后再安装，可参考文档：[统信UOS下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/%E7%BB%9F%E4%BF%A1UOS%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)。\n\n### 三、手动编译过程（Linux平台）\n1. 设置工作目录：`~/develop`    \n2. 获取相关代码    \n（1）`git clone https://github.com/rhett-lee/nim_duilib`      \n（2）`git clone https://github.com/rhett-lee/skia_compile`    \n（3）`git clone https://github.com/google/skia.git`  \n（4）`git clone https://github.com/libsdl-org/SDL.git`    \n3. 编译Skia库    \n\n| 操作系统平台            |参考文档（网络链接）    |  参考文档（本地文件） |\n| :---                    | :---       |:---   |\n|OpenEuler                |[OpenEuler下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/OpenEuler%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|[OpenEuler下编译skia.md](../skia_compile/OpenEuler%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|\n|OpenKylin（开放麒麟）    |[OpenKylin下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/OpenKylin%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|[OpenKylin下编译skia.md](../skia_compile/OpenKylin%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|\n|UbuntuKylin（优麒麟）    |[UbuntuKylin下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/UbuntuKylin%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)  |[UbuntuKylin下编译skia.md](../skia_compile/UbuntuKylin%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|\n|中科方德                 |[中科方德下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/%E4%B8%AD%E7%A7%91%E6%96%B9%E5%BE%B7%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)  |[中科方德下编译skia.md](../skia_compile/%E4%B8%AD%E7%A7%91%E6%96%B9%E5%BE%B7%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) |\n|统信UOS                  |[统信UOS下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/%E7%BB%9F%E4%BF%A1UOS%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|[统信UOS下编译skia.md](../skia_compile/%E7%BB%9F%E4%BF%A1UOS%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|\n|Ubuntu                   |[Ubuntu下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/Ubuntu%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) | [Ubuntu下编译skia.md](../skia_compile/Ubuntu%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) |\n|Debian                   |[Debian下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/Debian%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)  |[Debian下编译skia.md](../skia_compile/Debian%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) |\n|Fedora                   |[Fedora下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/Fedora%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)  |[Fedora下编译skia.md](../skia_compile/Fedora%E4%B8%8B%E7%BC%96%E8%AF%91skia.md)|\n|OpenSuse                 |[OpenSuse下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/OpenSuse%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) | [OpenSuse下编译skia.md](../skia_compile/OpenSuse%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) |\n\n    注意事项：skia源码编译的时候，应使用LLVM编译，程序运行比较流畅。\n4. 编译SDL库 \n```\n#!/bin/bash\ncd ~/develop\ncmake -S \"./SDL/\" -B \"./SDL.build\" -DCMAKE_INSTALL_PREFIX=\"./SDL3/\" -DSDL_SHARED=ON -DSDL_STATIC=OFF -DSDL_TEST_LIBRARY=OFF -DSDL_X11_XSCRNSAVER=OFF -DSDL_X11_XTEST=OFF -DCMAKE_BUILD_TYPE=Release\ncmake --build ./SDL.build\ncmake --install ./SDL.build\n```\n5. 编译nim_duilib\n```\n#!/bin/bash\ncd ~/develop/nim_duilib/\nchmod +x linux_build.sh\n./linux_build.sh\n```\n编译完成后，在bin目录中生成了可执行文件。    \n如果希望支持CEF，可以参考相关文档[docs/CEF.md](docs/CEF.md)。\n\n## C. 编译过程（macOS平台）\n### 一、准备工作：安装必备的软件\n安装完成系统后，需要做的工作：    \n#### 安装Xcode命令行工具\n```\nxcode-select --install\n```\n验证安装：\n```\nclang++ --version\n```\n#### 安装Homebrew\n```\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\n```\n如果失败，可以查找其他源来安装。    \n更新Homebrew：    \n```\nbrew update\n```\n#### 系统已经自带，无需安装的软件\n`git make unzip python3`\n\n#### 安装cmake\n```\nbrew install cmake\n```\n#### 安装ninja\n```\nbrew install ninja\n```\n#### 安装gn（需要从源码编译gn）\n```\nmkdir ~/develop\ncd ~/develop\ngit clone https://github.com/timniederhausen/gn\ncd gn\npython3 build/gen.py\nninja -C out\nsudo cp out/gn /usr/local/bin/\ngn --version\n```\n\n### 二、使用脚本自动编译（推荐）\n该脚本自动完成相关源码下载和编译工作。    \n选定一个工作目录（注意事项：路径中不能包含空格，否则编译脚本会出错），创建一个脚本`build.sh`，将下面已经整理好脚本复制进去，保存文件。    \n然后在控制台，为脚本文件添加可执行权限，最后运行该脚本： \n```\nchmod +x build.sh\n./build.sh\n```\n\n脚本文件内容如下：    \n```\n#!/bin/bash\n\n# Retry clone nim_duilib\nwhile true; do\n    if [ ! -d \"./nim_duilib/.git\" ]; then\n        git clone https://github.com/rhett-lee/nim_duilib\n    else\n        git -C ./nim_duilib pull\n    fi\n    if [ $? -ne 0 ]; then\n        sleep 10\n        continue\n    fi\n    break\ndone\n\nchmod +x ./nim_duilib/build/build_duilib_all_in_one.sh\n./nim_duilib/build/build_duilib_all_in_one.sh\n```\n编译完成的示例程序位于bin目录中。    \n\n### 三、手动编译过程（macOS平台）\n1. 设置工作目录：`~/develop`    \n2. 获取相关代码    \n（1）`git clone https://github.com/rhett-lee/nim_duilib`      \n（2）`git clone https://github.com/rhett-lee/skia_compile`    \n（3）`git clone https://github.com/google/skia.git`  \n（4）`git clone https://github.com/libsdl-org/SDL.git`  \n3. 编译Skia库    \n\n| 操作系统平台 |参考文档（网络链接） |  参考文档（本地文件） |\n| :---         | :---                |:---                   |\n|macOS         |[macOS下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/macOS%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) | [macOS下编译skia.md](../skia_compile/macOS%E4%B8%8B%E7%BC%96%E8%AF%91skia.md) |\n\n    注意事项：skia源码编译的时候，应使用LLVM编译，程序运行比较流畅。\n4. 编译SDL库 \n```\n#!/bin/bash\ncd ~/develop\ncmake -S \"./SDL/\" -B \"./SDL.build\" -DCMAKE_INSTALL_PREFIX=\"./SDL3/\" -DSDL_SHARED=ON -DSDL_STATIC=OFF -DSDL_TEST_LIBRARY=OFF -DSDL_X11_XSCRNSAVER=OFF -DSDL_X11_XTEST=OFF -DCMAKE_BUILD_TYPE=Release\ncmake --build ./SDL.build\ncmake --install ./SDL.build\n```\n5. 编译nim_duilib\n```\n#!/bin/bash\ncd ~/develop/nim_duilib/\nchmod +x macos_build.sh\n./macos_build.sh\n```\n编译完成后，在bin目录中生成了可执行文件。    \n如果希望支持CEF，可以参考相关文档[docs/CEF.md](docs/CEF.md)。\n\n## D. 编译过程（FreeBSD平台）\n### 一、准备工作：安装必备的软件\n```\nsudo pkg install git unzip python3 cmake ninja gn llvm fontconfig freetype2\n```\n### 二、使用脚本自动编译（推荐）\n该脚本自动完成相关源码下载和编译工作。    \n选定一个工作目录（注意事项：路径中不能包含空格，否则编译脚本会出错），创建一个脚本`build.sh`，将下面已经整理好脚本复制进去，保存文件。    \n然后在控制台，为脚本文件添加可执行权限，最后运行该脚本： \n```\nchmod +x build.sh\n./build.sh\n```\n\n脚本文件内容如下：    \n```\n#!/usr/bin/env bash\n\n# Retry clone nim_duilib\nwhile true; do\n    if [ ! -d \"./nim_duilib/.git\" ]; then\n        git clone https://github.com/rhett-lee/nim_duilib\n    else\n        git -C ./nim_duilib pull\n    fi\n    if [ $? -ne 0 ]; then\n        sleep 10\n        continue\n    fi\n    break\ndone\n\nchmod +x ./nim_duilib/build/build_duilib_all_in_one.sh\n./nim_duilib/build/build_duilib_all_in_one.sh\n```\n编译完成的示例程序位于bin目录中。\n\n​​注意：FreeBSD 平台不支持 CEF（Chromium Embedded Framework）。\n### 三、手动编译过程（FreeBSD平台）\n1. 设置工作目录：`~/develop`    \n2. 获取相关代码    \n（1）`git clone https://github.com/rhett-lee/nim_duilib`      \n（2）`git clone https://github.com/rhett-lee/skia_compile`    \n（3）`git clone https://github.com/google/skia.git`  \n（4）`git clone https://github.com/libsdl-org/SDL.git`  \n3. 编译Skia库    \n\n| 操作系统平台 |参考文档（网络链接） |  参考文档（本地文件） |\n| :---         | :---                |:---                   |\n|FreeBSD         |[FreeBSD下编译skia.md](https://github.com/rhett-lee/skia_compile/blob/main/FreeBSD下编译skia.md) | [FreeBSD下编译skia.md](../skia_compile/FreeBSD下编译skia.md) |\n\n    注意事项：skia源码编译的时候，只支持使用LLVM编译。\n4. 编译SDL库 \n```\n#!/usr/bin/env bash\ncd ~/develop\ncmake -S \"./SDL/\" -B \"./SDL.build\" -DCMAKE_INSTALL_PREFIX=\"./SDL3/\" -DSDL_SHARED=ON -DSDL_STATIC=OFF -DSDL_TEST_LIBRARY=OFF -DSDL_X11_XSCRNSAVER=OFF -DSDL_X11_XTEST=OFF -DCMAKE_BUILD_TYPE=Release\ncmake --build ./SDL.build\ncmake --install ./SDL.build\n```\n5. 编译nim_duilib\n```\n#!/usr/bin/env bash\ncd ~/develop/nim_duilib/\nchmod +x ./build/freebsd_build.sh\n./build/freebsd_build.sh\n```\n编译完成后，在bin目录中生成了可执行文件。    \n\n## 开发计划\n - 继续丰富界面库的控件，完善界面库的功能\n - 跨平台（Windows/Linux/macOS/FreeBSD）窗口引擎（基于[SDL3.0](https://www.libsdl.org/)）的不断测试与完善（目前X11/XWayland桌面环境下较稳定，但纯Wayland桌面环境下问题较多）\n - 测试界面库，发现缺陷并修复，不断完善代码\n\n## AI 辅助开发（Claude Code 集成）\n\nnim_duilib 提供了 AI 友好的文档和技能（Skills），可配合 [Claude Code](https://docs.anthropic.com/en/docs/claude-code) 实现 AI 辅助界面开发。\n\n### 功能说明\n注册后，Claude Code 在**任何项目**中都可以使用以下 nim_duilib 专属技能：\n\n| 指令 / 技能 | 说明 |\n| :--- | :--- |\n| `/nim-init` | 为当前项目初始化 nim_duilib 开发环境（复制 LLM 参考文档、更新 CLAUDE.md） |\n| `/nim-duilib-create-window` | 创建新窗口（自动生成 C++ 类 + XML 布局文件） |\n| `/nim-duilib-xml-layout` | 设计 XML 界面布局（表单、分栏、工具栏、卡片网格等模板） |\n| `/nim-duilib-add-control` | 添加控件（15+ 种控件的 XML 片段和 C++ 事件绑定代码） |\n| `/nim-duilib-event-handler` | 事件处理（XML 内联事件和 C++ Attach 绑定） |\n| `/nim-duilib-theme` | 主题定制（预定义颜色、字体、100+ 通用样式 Class 速查） |\n| `/nim-duilib-resource-pack` | 资源打包与部署（ZIP 打包、嵌入 EXE 单文件发布） |\n\n### 快速开始\n\n**前提条件：** 已安装 [Claude Code](https://docs.anthropic.com/en/docs/claude-code)\n\n**第一步：注册（只需执行一次）**\n\n在 nim_duilib 根目录下执行：\n```bash\n# Windows (CMD / PowerShell)\n.claude\\register.bat\n\n# Linux / macOS\nbash .claude/register.sh\n```\n注册脚本会将所有技能安装到 `~/.claude/skills/`，全局生效。\n\n**第二步：在你的应用项目中使用**\n\n在任何需要使用 nim_duilib 的项目中打开 Claude Code，输入：\n```\n/nim-init\n```\nAI 会自动为该项目配置 LLM 参考文档和 CLAUDE.md。之后即可直接用自然语言指示 Claude 完成界面开发，例如：\n- \"创建一个设置窗口，包含用户名输入框和保存按钮\"\n- \"设计一个左侧导航栏 + 右侧内容区的布局\"\n- \"给这个按钮添加点击事件\"\n- \"把资源打包成单个 EXE\"\n\n### 更新技能\n当 nim_duilib 的 AI 技能文件（`.claude/skills/`）有更新时，重新执行注册脚本即可：\n```bash\ncd nim_duilib\n.claude\\register.bat   # Windows\n# bash .claude/register.sh  # Linux / macOS\n```\n\n### 注销\n如需移除所有全局技能：\n```bash\nbash nim_duilib/.claude/unregister.sh\n```\n\n### 文件结构\n```\nnim_duilib/.claude/\n├── register.bat / register.ps1 / register.sh   # 全局注册脚本\n├── unregister.sh                                # 注销脚本\n├── docs/\n│   └── nim-duilib-llm-reference.md              # LLM 完整参考手册\n└── skills/                                      # AI 技能定义\n    ├── nim-duilib-create-window.md\n    ├── nim-duilib-xml-layout.md\n    ├── nim-duilib-add-control.md\n    ├── nim-duilib-event-handler.md\n    ├── nim-duilib-theme.md\n    └── nim-duilib-resource-pack.md\n```\n\n## 参考文档\n\n - [快速上手](docs/Getting-Started.md)\n - [示例程序](docs/Examples.md)\n - [全局样式：字体、颜色、图片等资源](docs/Global.md)\n - [窗口的样式](docs/Window.md)\n - [容器的样式](docs/Box.md)\n - [控件的样式](docs/Control.md)\n - [菜单的样式](docs/Menu.md)\n - [控件的事件/消息](docs/Events.md)\n - [XML文件中各控件的节点名称](docs/XmlNode.md)\n - [XML文件中直接响应控件的事件](docs/XmlEvents.md)\n - [CEF控件](docs/CEF.md)\n - [项目编译相关文档和脚本](build/build.md)\n - [参考文档](docs/Summary.md)\n\n## 相关链接\n1. Skia的编译文档库，点击访问：[skia_compile](https://github.com/rhett-lee/skia_compile) ：    \n2. 本项目是直接在NIM_Duilib_Framework项目的基础上继续开发的，项目地址：[NIM_Duilib_Framework](https://github.com/netease-im/NIM_Duilib_Framework/)\n3. NIM_Duilib_Framework项目是基于duilib开发的，项目地址：[duilib](https://github.com/duilib/duilib)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhett-lee%2Fnim_duilib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frhett-lee%2Fnim_duilib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhett-lee%2Fnim_duilib/lists"}