基於DirectUI 的SCW- App 主體部分的思路總結框架
基於 C++ 的 SC DirectUI 界面庫的想法與實現到今天也有近半個月了。一些新的想法與思路在學習和實踐中獲得了提升。推翻重來,重複再幹,雖然是件苦事,但,不得不爲之。這樣纔能有所提升。函數
上一篇: 基於DirectUI的SC設計規劃的我的構想與目標學習
設計 SCW時,曾總結了一下程序的組成部分:測試
全局: 管理程序中惟一性的數據成員,對象成員等。字體
桌面: 與系統桌面相關的一些參數或功能。好比桌面的屏幕大小,鼠標形狀等。
spa
窗口: 負責註冊窗、建立、顯示、銷燬窗口以及其餘與窗口相關的功能。
.net
事件: Windows系統下的消息處理。包括啓動消息循環、過濾、派發等。
設計
繪圖: 實現對窗口或打印機的繪圖輸出。經過GDI+或Direct2D等支持庫來完成。負責界面基本元素的功能實現。指針
組件: 組成窗口界面與事件處理的一系列控件。如 Label, Button, Edit等。
中間件
資源: 統一管理與分配程序中的圖片、文本、字體等資源。包括實現界面主題、多語種等因素。
功能: 程序最終要要完成的功能任務。
在以上總結的基礎上,完成SCW 的控制類 CWinApp時。曾計劃了兩套方案。
在考慮跨平臺下,參考了FireMonkey的思路,將各個功能部分以接口的形式,分別建立了不一樣的接口類。也已經基本實現了窗口 IWindowService、消息 IApplicationService、繪圖 CCanvas三個主體類部分的代碼。主控類CWinApp分別繼承了WindowService, IApplicationService 來實現主體功能。
後來因想加快速度,先不考慮不跨平臺了,想集中精力實現Windows下的DirectUI界面庫時。從新設計了CWinApp。想簡化思路,就將原來的代碼所有集合到一個CWinApp上。只將繪圖部分離出來了。也完成了這三個部分的基礎代碼。
可是,今天在從新審視框架時,發現這種兩種設計都存在缺點:
功能太集中。在一個CWinApp類裏,同時實現了窗口,消息、資源管理功能。雖然這些功能都是 一個App 應該完成的任務,可是集中寫到一個App。並非一個好的主意。雖然上面第一種方案有將功能分解成不一樣的接口類,可是以繼承派生的方式又集合到了一個CWinApp上。FireMonkey的思路雖然有好的地方,可是這種集合性功能,仍不方便。
功能太集中還會形成代碼也集中。在測試與更新代碼時。須要一堆過程函數中逐個去尋找,並定位到功能代碼塊。對之後的維護與完善也不是好事。
封裝不靈活,特別是第二種方案,雖然簡化了思路,只想由一個App類來解決全部問題。但同時也形成 App功能模塊的臃腫。擴展性也不方便靈活。雖然繼承、重寫能夠實現擴展,但容易出錯,且須要虛擬不少過程來實現繼承的目的。第一種方案較第二種強點,能夠經過改寫接口類來實現跨平臺(FireMonkey是這樣實現的),因爲是繼承接口類派生來來,擴展性仍然是問題。
總結以上的問題,加上本身在堆代碼,學習C++時的不斷深刻,對框架有了新的理解和更方便的解決方案。因此整理出來,重新設計 SCW – App 部分的框架。
主體想法是,仍採用功能分離的方式,生成不一樣的類。但不使用繼承的方式,而是以靜態指針的方式,動態生成不一樣功能類的實體。再統一由CApp類來管理這些功能類。構想以下:
CGlobal 註冊並管理 CApp實體, 程序內其餘對象能夠訪問 CGlobar及CApp
CApp動態建立各個功能類。如CScreen, CMsgController等。虛擬的建立過程可繼承重寫。方便擴展。
CApp的各個功能類容許程序內其餘對象訪問,以完成對應的功能。
SCW-主體結構規劃以下:
全局類 CGlobal
註冊 CApp類。其餘對象能夠經過這個全局類來訪問當前 CApp的實現,並實現相關功能。
管理全局性惟一對象。如桌面,鼠標,當前激活窗口,集點控件等。
全局參數的設置。如字體,界面主題、語種等。
全局類 CGlobal 是一個靜態對象實體,程序運行時即被產生。
主控類 CWinApp
由程序動態產生,可擴展。建立時,將實體指針直接註冊到 CGlobal中。
主要完成與程序相關的基本功能。
負責管理並生成其餘功能類。可繼承重寫生成過程,能實現添加新的功能控制類或註冊新的功能控制派生類。大大提升了可擴展性。
負責註冊繪圖引擎。可繼承重寫,能註冊不一樣的繪圖引擎。
桌面類 CScreen
可擴展,由CApp動態產生。提供與系統桌面相關的參數設置與功能函數。
消息處理類 CMsgController
可擴展,由CApp動態產生。提供消息循環、處理、派生等功能。是窗口及窗口內控件實現界面刷新與操做響應的核心中間件。
窗口控制類 CWndManager
可擴展,由CApp動態產生。提供窗口註冊、建立、銷燬等功能。
繪圖引擎類 CCanvas
可擴展,由CApp負責註冊。由具體的窗口生成繪圖實體。提供窗口及控件界面繪製的基本功能。是DirectUI界面實現的核心中間件。
組件類 CObject
派生併產生各類界面組件與功能組件。是實現DirectUI理念的核心中間件。
其餘
就是其餘,僅僅是其餘。想到的,須要的功能。
從最初計劃設計並想完成 SCW 的 DirectUI界面庫到如今。我在程序框架與基礎代碼上花了很多時間,反覆幾回,不斷修改。目的就是想邊學習,邊實踐,邊總結。在保證基礎框架更科學,更理想的狀況下,努力提升本身的想法,在實踐中得出經驗後,再不斷挖掘本身的能力。雖然框架屢次改寫,重構,貌似複雜勞動了不少次。但每次都有提升。一我的,雖然沒有人多集思廣益的好處。但也能夠這麼任性。
開始時多花點時間,甚至推翻重來,反覆幾回。這樣才能保證基礎的紮實,這樣才能提升本身。不知足與高要求,是作好任何一件事的基礎。此次的總結,估計也不會是最後一次的總結。都說寫代碼苦,如今終於體會到了。苦不是在於努力地敲鍵盤,而是,永遠有更好,永遠不能知足。這種也是:苦,並快樂着。有興趣纔是對的。
貼出來,是但願有心人能提供更多的幫助。
有興趣的朋友也能夠加Q或羣進行交流:
QQ羣:177312461 我的QQ:48018276