现在的位置: 首页 > 综合 > 正文

duilib鼠标键盘消息处理

2018年02月24日 ⁄ 综合 ⁄ 共 2630字 ⁄ 字号 评论关闭
一般的窗口没有处理鼠标键盘消息,而是直接返回让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)来确定指向的控件后触发相应的事件。


抱歉!评论已关闭.