DuiVision開發教程(5)-事件處理類編寫,duivision教程
使用DuiVision開發的介面程式中,除了介面的描述之外,最主要的工作就是商務邏輯的處理,為了將商務邏輯和介面展示能夠更好的分離,DuiVision中定義了事件處理基類,所有的商務邏輯都應該寫在派生的事件處理類中,並把事件處理對象註冊到相應的對話方塊或控制項上,這樣對應的子控制項有事件需要處理的時候,就會自動調用註冊的事件處理對象的相應函數。事件處理類只要在處理函數中根據控制項的ID或名字決定該做什麼事情,寫相應的處理代碼就可以。事件處理類中同時提供了一些函數方便根據ID或名字擷取到對應的控制項對象,並對控制項進行操作,例如改變控制項文字、擷取控制項的某個狀態等。
事件處理基類是CDuiHandler,這個類的定義如下,提供了擷取控制項對象、設定控制項的一些參數的函數,方便在事件處理類中對控制項的操作:
class CDuiHandler{public: CDuiHandler(void); virtual ~CDuiHandler(void); void SetDuiObject(CDuiObject* pDuiObject); CControlBase* GetControl(UINT uControlID); CControlBase* GetControl(CString strControlName); CDlgBase* GetControlDialog(UINT uControlID); void SetVisible(CString strControlName, BOOL bIsVisible); void SetDisable(CString strControlName, BOOL bIsDisable); void SetTitle(CString strControlName, CString strTitle); CString GetTitle(CString strControlName); virtual void OnInit(); virtual LRESULT OnDuiMessage(UINT uID, CString strName, UINT Msg, WPARAM wParam, LPARAM lParam); virtual void OnTimer(UINT uTimerID, CString strTimerName);protected: CDuiObject* m_pDuiObject; // 關聯的DUI對象};
下面這段代碼是在派生的事件處理類的OnDuiMessage函數中判斷如果點擊了某個按鈕,就修改一個進度條進度的代碼:
if(strName == _T("button_normal_3")) { CDuiProgress* pControl = (CDuiProgress*)GetControl(_T("progress")); if(pControl && (Msg == BUTTOM_UP)) { static int g_nProgress = 0; g_nProgress += 10; if(g_nProgress > 100) { g_nProgress = 0; } pControl->SetProgress(g_nProgress); } }
為了簡化事件處理類的編寫,使事件處理的代碼看起來更清晰一些,DuiHandler.h中定義了一些事件處理函數的訊息映射宏,如下表所示:
宏 |
參數 |
說明 |
DUI_DECLARE_MESSAGE_BEGIN |
類名 |
事件處理類的訊息映射宏開始 |
DUI_DECLARE_MESSAGE_END |
無 |
事件處理類的訊息映射宏結束 |
DUI_CONTROL_ID_MESSAGE |
控制項ID、處理函數 |
根據控制項ID,執行相應的處理函數 |
DUI_CONTROL_IDMSG_MESSAGE |
控制項ID、訊息、處理函數 |
根據控制項ID和訊息,執行相應的處理函數 |
DUI_CONTROL_NAME_MESSAGE |
控制項名、處理函數 |
根據控制項名,執行相應的處理函數 |
DUI_CONTROL_NAMEMSG_MESSAGE |
控制項名、訊息、處理函數 |
根據控制項名和訊息,執行相應的處理函數 |
實際定義的範例如下:
// 訊息處理定義DUI_DECLARE_MESSAGE_BEGIN(CDuiHandlerMain) DUI_CONTROL_ID_MESSAGE(APP_IPC, OnDuiMsgInterprocess) DUI_CONTROL_NAME_MESSAGE(NAME_SKIN_WND, OnDuiMsgSkin) DUI_CONTROL_NAMEMSG_MESSAGE(NAME_TRAY_ICON, MSG_TRAY_DBCLICK, OnDuiMsgTrayIconDClick) DUI_CONTROL_NAMEMSG_MESSAGE(L"notify_button_1", BUTTOM_UP, OnDuiMsgNotifyButton1) DUI_CONTROL_NAMEMSG_MESSAGE(L"notify_button_2", BUTTOM_UP, OnDuiMsgNotifyButton2) DUI_CONTROL_NAMEMSG_MESSAGE(L"notify_button_3", BUTTOM_UP, OnDuiMsgNotifyButton3) DUI_CONTROL_NAMEMSG_MESSAGE(L"listctrl_1", BUTTOM_DOWN, OnDuiMsgListCtrl1Click) DUI_CONTROL_NAMEMSG_MESSAGE(L"listctrl_2", BUTTOM_DOWN, OnDuiMsgListCtrl2Click)DUI_DECLARE_MESSAGE_END()
在編寫自己的Handler事件處理類時候可以參考範例,定義訊息映射宏,每個需要處理的訊息定義一行內容,定義出哪個控制項的什麼訊息需要處理,由哪個函數處理,訊息處理函數必須按照固定的參數格式來編寫,訊息處理函數的範例如下:
// 顯示資訊對話方塊訊息處理LRESULT CDuiHandlerMain::OnDuiMsgMsgBoxButton1(UINT uID, CString strName, UINT Msg, WPARAM wParam, LPARAM lParam){ DuiSystem::DuiMessageBox(NULL, _T("示範對話方塊!")); return TRUE;}
每個訊息處理函數必須按照以上範例中的參數格式,函數的傳回值表示此訊息是否不再需要向下傳遞繼續處理了,如果返回TRUE,則訊息處理結束,如果返回FALSE,則此訊息還可以繼續被後面定義的其他函數處理。
使用以上的宏定義,會自動在進入訊息處理函數時候記錄日誌,日誌內容類別似於下面這樣:
DEBUG 2014-09-07 22:43:31[98544] : CDuiHandlerMain::OnDuiMessage:uID=1109, name=menu_1, msg=1, wParam=0, lParam=0
DuiVision開原始碼(github):https://github.com/blueantst/DuiVision
藍螞蟻工作室首頁:http://www.blueantstudio.net
DuiVision QQ群:325880743
公眾號:blueantstudio 或搜尋 藍螞蟻工作室