首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

CWnd 閒置池模式:動態建立 UI 並大幅降低 GDI 資源消耗

     編輯:關於VC++

針對需動態切換大量控制項的介面場景(如多標籤裝置控制面板、類 Visual Studio 選項對話框),本文提出基於 CWnd 閒置池 的控制項復用架構。透過將隱藏控制項放入池中供下一個標籤復用,實測可將 GDI 物件數量降低 10 倍以上。

適用場景與痛點

  • 網管裝置控制面板:單一裝置擁有百餘參數,分 10 個標籤顯示,傳統每標籤一對話框需建立 400+ 控制項,GDI 資源極易耗盡。
  • 樹狀選單 + 內容面板:左側樹狀選單切換右側控制項群組,同類控制項(如 Slider、Label)在不同群組重複出現,極適合復用。

核心架構三層設計

1. CWndFreePool - 閒置池管理器

以型別字串(如 "Button"、"Slider")為鍵,管理可復用的 CWnd* 指標。提供 GetWnd(type) 取得與 AddWnd(type, pWnd) 歸還介面,析構時自動釋放池中所有視窗。

2. CWndControl 系列 - 控制項狀態封裝層

抽象基類 CWndControl 封裝通用屬性:可見性、啟用狀態、唯讀、位置、大小、字型、事件處理鏈、關聯控制項等。衍生類(CWndButton、CWndSlider 等)實作純虛函數 CreateWnd、UpdateWnd、OnCmdMsg,完成具體 MFC 控制項的建立與同步。

3. CWndContainer - 容器與復用協調者

附加至 CDialog,管理 CWndControl 集合。AddControl 時優先從池取得同類型 CWnd,調用 AttachWnd 綁定並套用屬性;RemoveControl 時呼叫 DetachWnd 隱藏並歸還池中。並轉發 OnCmdMsg 至對應控制項的事件處理器。

事件處理機制

定義 IWndEventHandler 介面與 CWndEvent 事件物件。控制項觸發命令時,容器分發事件至註冊的處理器(通常是對話框類),由 HandleWndEvent 依發送者名稱分派邏輯。

XML 驅動的動態 UI 示範專案

提供 MDI 示範專案 TestFreePool,每個 MDI 子視窗載入一個 XML 佈局檔,定義控制項群組與屬性。支援標準 MFC 控制項與 ActiveX 控制項(如 WebBrowser2)。內建右鍵選單「Show CWnd Count」統計實際建立的 CWnd 數量驗證資源節省效果。

XML 檔案說明實際 CWnd 數未用池估算值
Example1.xml所有支援控制項類型展示3041
Example2.xml12 群組,各 10 Label + 10 Button27259
Example3.xmlVS2005 選項對話框 3 頁模擬3048

控制項外觀層擴充

  • CTreeWnd / CListWnd:樹狀與列表控制項封裝。
  • CControlDlg:整合容器的實際對話框類別。
  • CControlGroup / CControlXml:XML 解析引擎,建構群組樹與控制項實例。
  • ControlWnd:頂層視窗,包含左側樹狀導航、右側內容區、事件日誌區。

總結與擴充建議

本架構證明了閒置池模式在動態 UI 場景下的顯著資源優勢。原始碼採用模組化設計,易於擴充新控制項類型(參考專案目錄下的說明文件)。事件機制雖簡單但足夠彈性,可依需求引入更豐富的事件參數與路由策略。XML 解析器採用輕量級 CMarkup,無額外依賴,適合嵌入式或綠色軟體部署。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved