基於DirectUI 的 SCW- App 主體部分的思路總結

基於DirectUI 的SCW- App 主體部分的思路總結框架

 

基於 C++ 的 SC DirectUI 界面庫的想法與實現到今天也有近半個月了。一些新的想法與思路在學習和實踐中獲得了提升。推翻重來,重複再幹,雖然是件苦事,但,不得不爲之。這樣纔能有所提升。函數

上一篇:  基於DirectUI的SC設計規劃的我的構想與目標學習


設計
SCW時,曾總結了一下程序的組成部分:
測試

  1. 全局: 管理程序中惟一性的數據成員,對象成員等。字體

  2. 桌面: 與系統桌面相關的一些參數或功能。好比桌面的屏幕大小,鼠標形狀等。
    spa

  3. 窗口: 負責註冊窗、建立、顯示、銷燬窗口以及其餘與窗口相關的功能。
    .net

  4. 事件: Windows系統下的消息處理。包括啓動消息循環、過濾、派發等。
    設計

  5. 繪圖: 實現對窗口或打印機的繪圖輸出。經過GDI+Direct2D等支持庫來完成。負責界面基本元素的功能實現。指針

  6. 組件: 組成窗口界面與事件處理的一系列控件。如 Label, Button, Edit等。
    中間件

  7. 資源: 統一管理與分配程序中的圖片、文本、字體等資源。包括實現界面主題、多語種等因素。

  8. 功能: 程序最終要要完成的功能任務。

 

在以上總結的基礎上,完成SCW 的控制類 CWinApp時。曾計劃了兩套方案。

  1. 在考慮跨平臺下,參考了FireMonkey的思路,將各個功能部分以接口的形式,分別建立了不一樣的接口類。也已經基本實現了窗口 IWindowService、消息 IApplicationService、繪圖 CCanvas三個主體類部分的代碼。主控類CWinApp分別繼承了WindowService, IApplicationService 來實現主體功能。

  2. 後來因想加快速度,先不考慮不跨平臺了,想集中精力實現Windows下的DirectUI界面庫時。從新設計了CWinApp。想簡化思路,就將原來的代碼所有集合到一個CWinApp上。只將繪圖部分離出來了。也完成了這三個部分的基礎代碼。

 

可是,今天在從新審視框架時,發現這種兩種設計都存在缺點:

 

  1. 功能太集中。在一個CWinApp類裏,同時實現了窗口,消息、資源管理功能。雖然這些功能都是 一個App 應該完成的任務,可是集中寫到一個App。並非一個好的主意。雖然上面第一種方案有將功能分解成不一樣的接口類,可是以繼承派生的方式又集合到了一個CWinApp上。FireMonkey的思路雖然有好的地方,可是這種集合性功能,仍不方便。

  2. 功能太集中還會形成代碼也集中。在測試與更新代碼時。須要一堆過程函數中逐個去尋找,並定位到功能代碼塊。對之後的維護與完善也不是好事。

  3. 封裝不靈活,特別是第二種方案,雖然簡化了思路,只想由一個App類來解決全部問題。但同時也形成 App功能模塊的臃腫。擴展性也不方便靈活。雖然繼承、重寫能夠實現擴展,但容易出錯,且須要虛擬不少過程來實現繼承的目的。第一種方案較第二種強點,能夠經過改寫接口類來實現跨平臺(FireMonkey是這樣實現的),因爲是繼承接口類派生來來,擴展性仍然是問題。

 

 

總結以上的問題,加上本身在堆代碼,學習C++時的不斷深刻,對框架有了新的理解和更方便的解決方案。因此整理出來,重新設計 SCW – App 部分的框架。

主體想法是,仍採用功能分離的方式,生成不一樣的類。但不使用繼承的方式,而是以靜態指針的方式,動態生成不一樣功能類的實體。再統一由CApp類來管理這些功能類。構想以下:

  1. CGlobal 註冊並管理 CApp實體, 程序內其餘對象能夠訪問 CGlobarCApp

  2. CApp動態建立各個功能類。如CScreen, CMsgController等。虛擬的建立過程可繼承重寫。方便擴展。

  3. CApp的各個功能類容許程序內其餘對象訪問,以完成對應的功能。

 

SCW-主體結構規劃以下:

 

  1. 全局類 CGlobal

    註冊
    CApp類。其餘對象能夠經過這個全局類來訪問當前 CApp的實現,並實現相關功能。

    管理全局性惟一對象。如桌面,鼠標,當前激活窗口,集點控件等。
    全局參數的設置。如字體,界面主題、語種等。

    全局類
    CGlobal 是一個靜態對象實體,程序運行時即被產生。

  2. 主控類 CWinApp

    由程序動態產生,可擴展。建立時,將實體指針直接註冊到
    CGlobal中。

    主要完成與程序相關的基本功能。
    負責管理並生成其餘功能類。可繼承重寫生成過程,能實現添加新的功能控制類或註冊新的功能控制派生類。大大提升了可擴展性。
    負責註冊繪圖引擎。可繼承重寫,能註冊不一樣的繪圖引擎。

  3. 桌面類 CScreen
    可擴展,由
    CApp動態產生。提供與系統桌面相關的參數設置與功能函數。

  4. 消息處理類 CMsgController

    可擴展,由
    CApp動態產生。提供消息循環、處理、派生等功能。是窗口及窗口內控件實現界面刷新與操做響應的核心中間件。

  5. 窗口控制類 CWndManager

    可擴展,由
    CApp動態產生。提供窗口註冊、建立、銷燬等功能。

  6. 繪圖引擎類 CCanvas

    可擴展,由
    CApp負責註冊。由具體的窗口生成繪圖實體。提供窗口及控件界面繪製的基本功能。是DirectUI界面實現的核心中間件。

  7. 組件類 CObject

    派生併產生各類界面組件與功能組件。是實現
    DirectUI理念的核心中間件。

  8. 其餘

    就是其餘,僅僅是其餘。想到的,須要的功能。

 

 

從最初計劃設計並想完成 SCW DirectUI界面庫到如今。我在程序框架與基礎代碼上花了很多時間,反覆幾回,不斷修改。目的就是想邊學習,邊實踐,邊總結。在保證基礎框架更科學,更理想的狀況下,努力提升本身的想法,在實踐中得出經驗後,再不斷挖掘本身的能力。雖然框架屢次改寫,重構,貌似複雜勞動了不少次。但每次都有提升。一我的,雖然沒有人多集思廣益的好處。但也能夠這麼任性。

 

開始時多花點時間,甚至推翻重來,反覆幾回。這樣才能保證基礎的紮實,這樣才能提升本身。不知足與高要求,是作好任何一件事的基礎。此次的總結,估計也不會是最後一次的總結。都說寫代碼苦,如今終於體會到了。苦不是在於努力地敲鍵盤,而是,永遠有更好,永遠不能知足。這種也是:苦,並快樂着。有興趣纔是對的。

 

貼出來,是但願有心人能提供更多的幫助。

有興趣的朋友也能夠加Q或羣進行交流:

QQ羣:177312461    我的QQ:48018276

相關文章
相關標籤/搜索