boost庫實在是乙個博大精深的庫。經過實驗,我發現巧用boost::bind和boost::function可以實現一些巧妙的設計。
編寫過mfc程式的朋友都知道,通過資源編輯器編輯選單項,設定選單項id,然後mfc內部通過該id來對映選單命令處理函式和選單介面更新函式。我設想撇開mfc的資源編輯,在mfc程式中通過xml檔案來進行介面配置,然後利用字串來對映訊息處理函式。借助boost庫,我實現了這一設想。具體就是在xml檔案指定乙個字串,然後通過這個字串就能找到它的命令訊息處理函式和介面更新命令訊息處理函式。
下面具體談談怎麼實現這一設想。我需要解決的是兩大問題:一是通過xml檔案來動態建立介面;二是根據xml檔案裡指定的選單項字串找到它的命令訊息處理函式。
第乙個問題相對簡單。首先我談談我的系統介面配置xml檔案的設計。我的系統介面配置xml檔案比較簡單,具體如下:
簡單解釋就是:framework節點儲存的是程式的基本資訊,包括包含了程式名、公司名和公司**;接著就是uidescription--介面描述,主要包括全部選單欄資訊和選單項資訊。
對應這個系統配置xml檔案,我們需要在程式中定義相應的結構體,具體如下:
程式定義了乙個基於tinyxml庫的xml檔案解析類cxmlparse,關於如何解析xml檔案本部落格已經有過詳細介紹,具體參考如下文章:
tinyxml快速入門(一)
tinyxml快速入門(二)
tinyxml快速入門(三)
就tinyxml使用答覆一位網友
將tinyxml快速入門的介面物件導向化
具體做法是在應用程式類裡定義兩個變數:
在程式初始化例項函式initinstance()裡呼叫cxmlparse類的介面來解析系統配置檔案。根據解析系統xml檔案來動態建立選單欄的**也比較簡單,集中在getallmenubar和mainmenubarcreate兩個函式,具體見上傳的**,這裡不作贅述。
下面我具體談談如何通過xml檔案中指定的選單id字串來對映它的訊息處理函式,概括來說是通過乙個函式來實現的。
view plaincopy to clipboardprint?
/**
* /brief 選單命令訊息處理函式指標。
* */
typedef boost::functioncmdfunction;
/**
* /brief 選單介面更新命令訊息處理函式指標。
* */
typedef boost::functionupdatecmduifunction;
/*** /brief 選單命令訊息處理函式指標。**/
typedef boost::functioncmdfunction;
/*** /brief 選單介面更新命令訊息處理函式指標。**/
typedef boost::functionupdatecmduifunction;
在框架類裡定義乙個map,選單id作為鍵,訊息處理函式指標作為鍵值:
然後在建立選單的時候將訊息處理函式指標新增進這個map:
最後過載框架類的oncmdmsg函式,根據選單id值呼叫map裡的函式:
程式用到的第三方庫包括:tinyxml 2.5.3和boost 1.34。
巧用boost庫實現字串對映訊息處理函式
boost庫實在是乙個博大精深的庫。經過實驗,我發現巧用boost bind和boost function可以實現一些巧妙的設計。編寫過mfc程式的朋友都知道,通過資源編輯器編輯選單項,設定選單項id,然後mfc內部通過該id來對映選單命令處理函式和選單介面更新函式。我設想撇開mfc的資源編輯,在m...
巧用boost庫實現字串對映訊息處理函式
boost庫實在是乙個博大精深的庫。經過實驗,我發現巧用boost bind和boost function可以實現一些巧妙的設計。編寫過mfc程式的朋友都知道,通過資源編輯器編輯選單項,設定選單項id,然後mfc內部通過該id來對映選單命令處理函式和選單介面更新函式。我設想撇開mfc的資源編輯,在m...
巧用boost庫實現字串對映訊息處理函式
boost 庫實在是乙個博大精深的庫。經過實驗,我發現巧用boost bind和boost function可以實現一些巧妙的設計。編寫過mfc程式的朋友都知道,通過資源編輯器編輯選單項,設定選單項id,然後mfc內部通過該id來對映選單命令處理函式和選單介面更新函式。我設想撇開mfc的資源編輯,在...