Duilib学习笔记《05》— 消息响应处理
在Duilib學習筆記《04》中已經知道了如何將窗體顯示出來,而如何處理窗體上的事件、消息呢?
一. 系統消息
窗體顯示的時候我們就已經說了,窗體是繼承CWindowWnd類的,對于窗體的部分消息的處理,需要重載該類的LRESULT?HandleMessage(UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam);?函數。在顯示窗體部分我們創建窗體WM_CREATE消息以及屏蔽標題欄WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT等消息?都是在HandleMessage中進行處理:
LRESULT CMainWndDlg::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) {LRESULT lRes = 0;BOOL bHandled = TRUE;switch( uMsg ) {case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;case WM_NCACTIVATE: lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break;case WM_NCCALCSIZE: lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break;case WM_NCPAINT: lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;case WM_NCHITTEST: lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break;case WM_CLOSE: lRes = OnClose(uMsg, wParam, lParam, bHandled); break;case WM_DESTROY: lRes = OnDestroy(uMsg, wParam, lParam, bHandled); break;case WM_SIZE: lRes = OnSize(uMsg, wParam, lParam, bHandled); break;case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break;case WM_SYSCOMMAND: lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break;case WM_KEYDOWN: PostQuitMessage(0); break;default:bHandled = FALSE;}if( bHandled ) return lRes;if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;return CWindowWnd::HandleMessage(uMsg, wParam, lParam); }如同代碼中所示,如果消息不需要框架再處理了則直接返回。如果還需要框架處理該消息,則交由父類的HandleMessge中去處理。
?void CMainWndDlg::Notify( TNotifyUI& msg ) {if( msg.sType == _T("windowinit") ) {OnWindowInit();}else if( msg.sType == _T("click") ) {if( msg.pSender == m_pCloseBtn ) {PostQuitMessage(0);return; }else if( msg.pSender == m_pMinBtn ) { SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0); return; }else if( msg.pSender == m_pMaxBtn ) { SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, 0); return; }else if( msg.pSender == m_pRestoreBtn ) { SendMessage(WM_SYSCOMMAND, SC_RESTORE, 0); return; }// 按鈕消息OnLBtnClick(msg.pSender);}else if(msg.sType==_T("selectchanged")){CDuiString name = msg.pSender->GetName();CTabLayoutUI* pTabSwitch = static_cast<CTabLayoutUI*>(m_PaintManager.FindControl(_T("tab_switch")));CTabLayoutUI* pDemoListSwitch = static_cast<CTabLayoutUI*>(m_PaintManager.FindControl(_T("demo_list_tab_switch")));if(name.CompareNoCase(_T("demo_tab")) == 0)pTabSwitch->SelectItem(0);else if(name.CompareNoCase(_T("web_tab")) == 0) pTabSwitch->SelectItem(1);if(name.CompareNoCase(_T("demo_list_basic_ctrl")) == 0)pDemoListSwitch->SelectItem(0);else if(name.CompareNoCase(_T("demo_list_rich_ctrl")) == 0)pDemoListSwitch->SelectItem(1);} }二. 事件消息
對于系統消息我們直接重載了HandleMessage來處理,而對于鼠標點擊一類的消息呢?為此,我們的窗體除了要繼承CWindowWnd外,還需要繼承INotifyUI,同樣的重載INotifyUI類中的void?Notify(TNotifyUI&?msg);?函數,由該函數來處理控件操作產生的消息。但僅僅只是繼承重載了還不夠,我們怎么才能確保事件消息能正常傳遞呢?因此,在窗體創建OnCreate的時候,我們還需要添加如下m_PaintManager.AddNotifier(this);?這樣,控件消息就可以傳達大duilib的消息循環中,我們也就可以通過Notify函數對消息進行處理:
在Notify函數中針對消息的不同進行不同的操作處理,比如click、selectchanged等等。對于這類duilib針對相關操作自定義的消息類型可以在duilib工程中的UIDefine.h文件中查看:
//定義所有消息類型 //#define DUI_MSGTYPE_MENU (_T("menu")) #define DUI_MSGTYPE_LINK (_T("link"))#define DUI_MSGTYPE_TIMER (_T("timer")) #define DUI_MSGTYPE_CLICK (_T("click"))#define DUI_MSGTYPE_RETURN (_T("return")) #define DUI_MSGTYPE_SCROLL (_T("scroll"))#define DUI_MSGTYPE_DROPDOWN (_T("dropdown")) #define DUI_MSGTYPE_SETFOCUS (_T("setfocus"))#define DUI_MSGTYPE_KILLFOCUS (_T("killfocus")) #define DUI_MSGTYPE_ITEMCLICK (_T("itemclick")) #define DUI_MSGTYPE_TABSELECT (_T("tabselect"))#define DUI_MSGTYPE_ITEMSELECT (_T("itemselect")) #define DUI_MSGTYPE_ITEMEXPAND (_T("itemexpand")) #define DUI_MSGTYPE_WINDOWINIT (_T("windowinit")) #define DUI_MSGTYPE_BUTTONDOWN (_T("buttondown")) #define DUI_MSGTYPE_MOUSEENTER (_T("mouseenter")) #define DUI_MSGTYPE_MOUSELEAVE (_T("mouseleave"))#define DUI_MSGTYPE_TEXTCHANGED (_T("textchanged")) #define DUI_MSGTYPE_HEADERCLICK (_T("headerclick")) #define DUI_MSGTYPE_ITEMDBCLICK (_T("itemdbclick")) #define DUI_MSGTYPE_SHOWACTIVEX (_T("showactivex"))#define DUI_MSGTYPE_ITEMCOLLAPSE (_T("itemcollapse")) #define DUI_MSGTYPE_ITEMACTIVATE (_T("itemactivate")) #define DUI_MSGTYPE_VALUECHANGED (_T("valuechanged"))#define DUI_MSGTYPE_SELECTCHANGED (_T("selectchanged"))//
三. 消息過濾
在實際中,我們有時候可能需要根據需要對部分消息進行分類處理。比如鍵盤按鍵消息等等。對于這類情況,我們的窗體需要繼承IMessageFilterUI類,重載LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)函數,同時在窗體OnCreate創建的時候添加m_pm_.AddPreMessageFilter(this)消息通知即可。
總結
以上是生活随笔為你收集整理的Duilib学习笔记《05》— 消息响应处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库mysql加密存储_数据库数据加密
- 下一篇: 逐帧动画实现