本来是想做一个控件,当鼠标移入的时候控件高亮度显示,移出时恢复,
我也知道WINDOWS里有WM_MOUSELEAVE 和 WM_MOUSEHOVER消息,可以直接用捕捉,但我在MFC里这样做动完全没有反应。
我的步骤是平常那样先加入消息映射: ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
然后,在头文件加入相应函数:
   
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
最后在CPP文件实现,但从结果中看,程序并没有捕捉到这两个消息。
 
为了试验是不是MFC不响应这两个消息,我又重载了WindowProc代码如下
LRESULT CGraphicButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
        if (message==WM_MOUSELEAVE)MessageBox("mouse leave");
return CButton::WindowProc(message, wParam, lParam);
}结果仍然没有捕捉到消息,
现在为了模拟这两个消息,我只好重载OnNcHitTest了,但当鼠标快速移动时模拟会出现“误判”---捕捉不到消息。这下可如何是好?难道为了实现这么一个功能还要大张旗鼓地用勾子函数监视鼠标?大家探讨探讨!

解决方案 »

  1.   

    http://topic.csdn.net/t/20060210/22/4550219.html
      

  2.   

    c里面没有网页上那种mouseout、mouseover的消息的。要自己处理mousemove
      

  3.   

    WM_MOUSELEAVE,WM_MOUSEHOVER这两个消息是和TrackMouseEvent这个API函数配合使用的。而且当窗口接收到这两个消息后,必须再次调用TrackMouseEvent,否则窗口不会再收到这两个消息。
    详情在MSDN.
      

  4.   

    #if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
    #define WM_MOUSEHOVER                   0x02A1
    #define WM_MOUSELEAVE                   0x02A3
    #endif还要注意几个宏,版本低的话,是找不到定义的
      

  5.   

    TRACKMOUSEEVENT t_MouseEvent;
    t_MouseEvent.cbSize       =  sizeof(TRACKMOUSEEVENT);
    t_MouseEvent.dwFlags      =  TME_LEAVE | TME_HOVER;
    t_MouseEvent.hwndTrack    =  m_hWnd;
    t_MouseEvent.dwHoverTime  =  30;::_TrackMouseEvent(&t_MouseEvent);
      

  6.   

    这是我试验的代码,共享:
    .h文件加入:
             afx_msg   LRESULT  OnMouseLeave(WPARAM ,LPARAM );   
    afx_msg   LRESULT  OnMouseHover(WPARAM ,LPARAM );   

    .cpp文件加入:
          ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)   
          ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) 
    LRESULT CIconButton::OnMouseLeave(WPARAM  wParam,LPARAM lParam)   
    {  
    InvalidateRect(NULL);
    return   0;   
    }   LRESULT  CIconButton::OnMouseHover(WPARAM   wParam,LPARAM   lParam)   
    {   
    CClientDC dc(this);
    CRect rt;
    GetClientRect(&rt);
    dc.Draw3dRect(0,0,
    m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,
    RGB(0,0,0),RGB(10,10,10));
    return   0;   
    }   
    void CIconButton::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default

    CButton::OnMouseMove(nFlags, point);
    TRACKMOUSEEVENT   tme;   
    tme.cbSize=sizeof(TRACKMOUSEEVENT);   
    tme.dwFlags=TME_HOVER   |   TME_LEAVE;   
    tme.dwHoverTime=HOVER_DEFAULT;  
    tme.hwndTrack=m_hWnd; 
        _TrackMouseEvent(&tme);   
    }