DuiVision開發教程(5)-事件處理類編寫,duivision教程

來源:互聯網
上載者:User

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 或搜尋 藍螞蟻工作室

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.