duilib滑鼠鍵盤訊息處理
阿新 • • 發佈:2019-01-07
一般的視窗沒有處理滑鼠鍵盤訊息,而是直接返回讓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)來確定指向的控制元件後觸發相應的事件。