1. 程式人生 > >duilib滑鼠鍵盤訊息處理

duilib滑鼠鍵盤訊息處理

一般的視窗沒有處理滑鼠鍵盤訊息,而是直接返回讓CPaintManagerUI去處理。(想知道duilib整體的訊息處理過程,請參考本部落格其他文章) 首先用自己的語言描述幾個名詞: 準事件控制元件m_pEventClick:在WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_LBUTTONDBLCLK訊息中設定,在WM_LBUTTONUP,WM_CONTEXTMENU訊息中置零。為什麼叫準事件控制元件呢?對按鈕來說,要想讓按鈕觸發事件,我們必須點選按鈕,也就是滑鼠在按鈕上BUTTONDOWN,表明我們在按鈕上'按下去'了。但是按下去了不會馬上觸發它的訊息,按下去之後'彈上來'才會觸發訊息,這給了按鈕一個反悔的空間,比如你一不小心按了下按鈕,只要不鬆開,在其他地方鬆開是不會觸發按鈕的。一般用來響應模擬滑鼠Up,滑鼠右鍵產生WM_CONTEXTMENU等訊息。 當前控制元件m_pEventHover 
:滑鼠盤旋(Hover)之上的控制元件。用來響應模擬滑鼠Enter,Hover,Leave等訊息。 好了,讓我們探討一下,duilib是如何觸發滑鼠鍵盤相關的事件的 焦點控制元件m_pFocus:表示哪個控制元件獲取了焦點。在WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_CHAR,WM_KEYDOWN,WM_SIZE訊息 時用到,在WM_LBUTTONDOWN,WM_RBUTTONDOWN訊息中被設定。 當前鍵控制元件m_pEventKey:表示鍵盤鍵彈起來時(為什麼不是按下去,和按鈕類似)指向的當前焦點控制元件。在WM_KEYDOWN訊息中設定,WM_KEYUP中置零。 下面具體分析duilib中滑鼠鍵盤訊息。 滑鼠移動Mouse_Move訊息: 在duilib中滑鼠移動訊息會引起如下事件: ①進入新的當前控制元件,程式碼如下: CControlUI* pNewHover = FindControl(pt); if( pNewHover != m_pEventHover && pNewHover != NULL ) { //進入了新當前控制元件                 event.Type = UIEVENT_MOUSEENTER;    //模擬滑鼠 進入控制元件時的訊息
                event.pSender = pNewHover;                 pNewHover->Event(event);                 m_pEventHover = pNewHover;  //在這裡設定新的當前控制元件     } ②從其它控制元件進入新的控制元件  if( pNewHover != m_pEventHover && m_pEventHover != NULL ) { //從其他控制元件進入新的當前控制元件                 event.Type = UIEVENT_MOUSELEAVE;                 event.pSender = m_pEventHover;                 m_pEventHover->Event(event);                 m_pEventHover = NULL;                 if( m_hwndTooltip != NULL ) ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, FALSE, (LPARAM) &m_ToolTip);        } 可以看出滑鼠從其它控制元件進入新的控制元件時會讓tooltip消失。 滑鼠移動後停留勢必會發出WM_MOUSEHOVER訊息。duilib除了響應控制元件的MOUSEHOVER訊息外,還建立ToolTip
:  if( m_hwndTooltip == NULL ) {                 m_hwndTooltip = ::CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, m_hWndPaint, NULL, m_hInstance, NULL);                 ::SendMessage(m_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM) &m_ToolTip);             }    ::SendMessage( m_hwndTooltip,TTM_SETMAXTIPWIDTH,0, pHover->GetToolTipWidth());             ::SendMessage(m_hwndTooltip, TTM_SETTOOLINFO, 0, (LPARAM) &m_ToolTip);             ::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, TRUE, (LPARAM) &m_ToolTip); 滑鼠WM_LBUTTONDOWN訊息: 除了響應控制元件模擬BUTTONDOWN之外還設定準事件控制元件,設定控制元件焦點並賦值焦點控制元件m_pFocus。 滑鼠WM_LBUTTONDBLCLK訊息: 除了響應控制元件模擬DBLCLICK之外還設定準事件控制元件。 滑鼠WM_LBUTTONUP訊息; 準事件控制元件m_pEventHover 觸發BUTTONUP事件,並置m_pEventHover為0。 滑鼠WM_RBUTTONDOWN訊息: 除了響應控制元件模擬RBUTTONDOWN之外還設定準事件控制元件,設定控制元件焦點並賦值焦點控制元件m_pFocus。 WM_CONTEXTMENU訊息: 注意,該訊息是右鍵滑鼠產生的,參看MSDN:The WM_CONTEXTMENU message notifies a window that the user clicked the right mouse button (right clicked) in the window. 在該訊息下,觸發CONTEXTMENU事件,並置m_pEventHover為0。 WM_CHAR訊息: 焦點控制元件m_pFocus觸發UIEVENT_CHAR訊息。 WM_KEYDOWN訊息: 焦點控制元件m_pFocus觸發KEYDOWN訊息,並設定當前鍵控制元件m_pEventKey為該焦點控制元件m_pFocus WM_KEYUP訊息: 前鍵控制元件m_pEventKey觸發KEYUP訊息並置該值為0 其它諸如WM_SETCURSOR,WM_MOUSEWHEEL與滑鼠鍵盤相關的訊息,都是根據座標查詢控制元件FindControl(pt)來確定指向的控制元件後觸發相應的事件。