序言
Duilib介紹
Duilib是windows平臺下的一款輕量級directUI開源庫(遵循BSD協議),徹底免費,可用於商業軟件開發,只需在軟件包裏附上協議文件便可。Duilib能夠簡單方便地實現大多數界面需求,包括換膚、換色,透明等功能,支持多種圖片格式,使用XML能夠方便地定製窗口,能較好地作到UI和邏輯相分離,儘可能減小在代碼裏建立UI控件。目前,Duilib庫已經漸趨穩定,目前在國內有較爲普遍的使用,網絡上也有不少的使用教程。git
網易雲信Duilib介紹
Duilib是在研發易信PC版時被引入,歷經六七年的研發過程,相對於原版Duilib,網易雲信Duilib修復了一些問題和不足,包括但不限於控件種類不豐富、不支持動畫、不支持半透明異形窗體、對多線程支持很差等,目前,網易雲信Duilib配合比較高效的引擎庫Base解決多線程問題,能夠作出功能更強更穩定的客戶端界面。github
網易雲信Duilib特點
- 多國語言支持
- 通用樣式支持
- DPI 縮放支持
- GIF 動畫支持
- CEF 控件支持(CEF 2623 支持 XP)
- 觸控設備支持(Surface、Wacom)
- 抽象渲染接口(爲其餘渲染引擎提供支持)
源碼使用
克隆項目到你的磁盤中windows
git clone https://github.com/netease-im/NIM_Duilib_Framework網絡
進入 NIM_Duilib_Framework/samples 目錄,使用 Visual Studio 2013 Update 5 以上版本 IDE 打開 samples.sln。 數據結構
工程目錄結構
- bin輸出目錄
- docs 文檔
- libs 靜態庫
- samples 示例Demo程序
- third_party 第三方庫
- toolkits
─ base 基礎類庫多線程
─ duilib 核心代碼閉包
─ shared 工具類庫框架
─ ui_components 組件庫異步
模塊介紹
- Bin:輸出目錄,各個示例程序輸出目錄,包含預設的皮膚和語言文件以及 CEF 依賴。
- Docs:文檔,duilib 接口的說明文檔。
- Libs:靜態庫,靜態庫編譯後的輸出目錄,包含預設的一些 CEF 組件靜態庫。
- Samples:示例Demo程序。
- Third_party:第三方庫,目前僅有 cef_control 有依賴。
- Base:基礎類庫,提供了基本框架Messageloops,閉包,基本函數庫(file、network等),基本類庫(time,線程,定時器等),基本工具庫(log,加解密)等
- Duilib:duilib 核心代碼,依賴 base 但不依賴 shared
- Shared:工具共享庫,對base庫,第三方庫作的簡單的封裝,如命令行解析、日誌、路徑處理,供其餘模塊使用。
- ui_components:組件庫,基於 duilib 封裝的經常使用組件庫如 msgbox、toast、cef_control 等
控件介紹
容器
容器可做爲容器控件的介質,包含經常使用的水平佈局和垂直佈局等容器。在一個程序界面開始設計前首先要考慮整個界面的佈局,這就要用到容器。不一樣的容器有不一樣的佈局樣式,如下爲支持的容器類型,可根據本身須要選擇進行佈局。ide
- Box 自由佈局容器
- HBox 水平佈局容器
- VBox 垂直佈局容器
- TabBox 多標籤佈局容器
- TileBox 格子布局容器
- ScrollableBox 帶有滾動條的佈局容器
- ChildBox 子佈局容器
列表
此目錄下包含一些列表容器,方便管理同類型的多份數據,如下列舉了可用的列表容器。
- Combo 下拉列表
- ListBox 普通列表
- TreeView 屬性列表
- VirtualListBox 虛擬列表
控件
控件包含了全部可用的獨立控件,如按鈕、文本、進度條等,提供用戶輸入或輸出內容提供使用者查看。如下列舉了全部可用的控件列表。
- Window 用於容納全部控件的窗口,這裏暫時放到控件分類中
- Control 全部控件的基類,包含了控件的基本屬性和接口
- Button 按鈕控件
- CheckBox 複選框
- Option 單選框
- Label 文本
- Progress 進度條
- Slider 滑動條
- RichEdit 富文本
- ScrollBar 滾動條
- CefControl CEF 控件
盒子
盒子一般用於容納一組不一樣的控件但由整個盒子統一響應用戶觸發的事件。不一樣於普通的容器或普通的控件,它們具備容器的基本佈局功能,也具有控件的事件響應機制。
通常用於列表中顯示一個子項,或者樹形列表中顯示一個節點,但這些子項和節點可能包含豐富的圖標和文字描述並要求能夠響應用戶觸發的事件。在這種場景下就會使用到這些盒子了,如下爲支持的盒子模型:
- ListContainerElement 經常使用於列表中顯示一個子項
- TreeNode 經常使用於樹形列表中顯示一個子節點
- Other 一些其餘的盒子模型
工具
- DPI Manager DPI 管理
- Muilt Language 多語言管理
- Shadow 陰影管理
- Window Base 窗口基礎幫助類
應用開發框架介紹
線程模型和消息隊列
- 線程模型參考Chromium基於異步通訊的多線程模型。
- 一個線程請求另外一個線程執行任務的時候,只需將任務封裝成一個閉包投遞到對方線程的任務隊列便可,無需等待,減小卡頓。
- 相比於常見的基於鎖的線程運行模式,減小了鎖的開銷,提升了線程的響應性。
- 這種基於異步通訊的多線程模型,要求設計好各個子模塊及其對應的數據結構,使得在協做時能夠最大程度地進行異步通訊。
引用
該文多爲網易雲信公開技術文檔部分摘抄,如需詳細閱讀請進入如下傳輸門:
github.com/netease-im/…
github.com/netease-im/…
NIM Windows(PC)Demo導讀
感謝
Duilib自己來自於開源社區,現在咱們經過回饋開源社區,但願繼續致力於與社區一塊兒建立開發平臺。咱們的Windows應用界面開發框架已經準備好在GitHub上作出貢獻:github.com/netease-im/…。開源該技術提升了產品團隊與開發者之間的透明度,有助於Windows開發的普及,並使開發者可以參與並對這些開源技術作出持續貢獻。
最後,感謝曾經以及現在還在爲網易雲信Duilib貢獻代碼的小夥伴們,包括但不限於陽光,redrain,harrison等等大佬們。