轉自 http://note.sdo.com/u/icez/n/mvO-X~jyVnpFnM01A0000m
DirectUI意為直接在父窗口上繪圖(Paint on parent dc directly)。即子窗口不以窗口句柄的形式創建(windowless),只是邏輯上的窗口,繪制在父窗口之上。微軟的“DirectUI”技術廣泛的應用於Windows XP、Vista、Windows 7,如瀏覽器左側的TaskPanel,控制面板導航界面,Media Player播放器,即時通訊工具MSN Messager等。
DirectUI好處在於可以很方便的構建高效、絢麗的、非常易於擴展的界面。國外如微軟,國內如騰訊、百度等公司的客戶端產品多采用這種方式來組織界面,從而很好的將界面和邏輯分離,同時易於實現各種超炫的界面效果如換色、換膚、透明等。
DirectUI可以理解為一個輕量級的WPF,可以讓C++做出C#般絢麗的界面。目前國內做DirectUI皮膚庫的公司主要有兩家:第一家是UIPower(即Skin++的公司),網址www.uipower.com,其DirectUI產品網站www.directui.com,做的很專業;另一家是UIEASY,網址www.uieasy.com,一個輕量級皮膚庫DSkinLite。但是,網上關於DirectUI的技術文章卻很少;早在 6/26/2005,一個國外的程序員就已經寫了一個開源的DirectUI例子,應該算是國內所有directui界面庫的起源了,網址http://www.viksoe.dk/code/windowless1.htm,探討一種實現的可能性和思路,和實際應用雖有一定距離,不過卻是一個很好的學習資料。再后來,一個國內的程序員“當個傻瓜蛋”,基於此代碼,進行重構和修正Bug,並放到了google上開源,網址http://code.google.com/p/duilib/,下載地址svn checkout http://duilib.googlecode.com/svn/trunk/ duilib-read-only。
本人通過學習這個duilib的源代碼,學到了很多知識、思路和經驗,分享給看到此文的朋友,共同探討DirectUI技術,並歡迎大家加入到開發開源DirectUI皮膚庫的行列當中。分析難免有誤,見諒!
一、核心類
1. CWindowWnd,窗口對象管理父類,主要作用:
1) 創建窗口。
2) 窗口消息過程處理。
3) 提供窗口子類化與超類化接口。
2. CDialogBuilder,控件布局類,主要作用:
1) 讀取XML腳本,分析腳本,構建控件樹。
2) 創建控件對象。
3. CPaintManagerUI,窗口消息及圖形繪制管理器類,與窗口綁定,主要作用:
1) 繪制控件。
2) 消息管理。
3) 事件通知。
4. INotifyUI,事件通知抽象類,主要作用:
1) 重載Notify虛函數,處理事件通知。
二、控件類
1. CControlUI,控件管理父類,主要作用:
1) 控件的通用基類,提供控件通用屬性管理。
2. CLabelUI,靜態標簽類,父類CControlUI。
3. CButtonUI,按鈕類,父類CLabelUI。
4. COptionUI,選擇按鈕類,父類CButtonUI。
5. CTextUI,靜態文本類,父類CLabelUI。
6. CProgressUI,進度條類,父類CLabelUI。
7. CSliderUI,父類CProgressUI。
8. CEditUI,編輯框類,父類CLabelUI。
9. CListUI,列表框類,父類CVerticalLayoutUI、IListUI。
1) CListHeaderUI,父類CHorizontalLayoutUI。
2) CListHeaderItemUI,列表頭類,父類CControlUI。
3) CListTextElementUI,類表文本類,父類CListLabelElementUI。
4) CListLabelElementUI,父類CListElementUI。
10. CComboUI,組合框類,父類CContainerUI、IListOwnerUI。
11. CActiveXUI,ActiveX控件類,父類CControlUI、 IMessageFilterUI。
12. CContainerUI,容器類,父類CControlUI、IContainerUI。
13. CTabLayoutUI,選項頁布局類,父類CContainerUI。
14. CTileLayoutUI,父類CContainerUI。
15. CDialogLayoutUI,對話框布局類,父類CContainerUI。、
16. CVerticalLayoutUI,垂直布局類,父類CContainerUI。
17. CHorizontalLayoutUI,水平布局類,父類CContainerUI。
18. CListExpandElementUI,父類CListTextElementUI。
19. CListContainerElementUI,父類CContainerUI、IListItemUI。
三、輔助類
1. CStdPtrArray,指針數組。
2. CStdValArray,數據數組。
3. CStdString,字符串數組。
4. CStdStringPtrMap,字符串指針映射數組。