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