请问如何在自己写的button类里面判断鼠标是否离开了button对象?
      BOOL CZSM_Button::PreTranslateMessage(MSG* pMsg) 
      {
if(pMsg->message==WM_MOUSELEAVE)
m_bMouseOn=FALSE;
         return CButton::PreTranslateMessage(pMsg);
       }
我在这里拦截不到WM_MOUSELEAVE消息,        谢谢

解决方案 »

  1.   

    你首先要SetCapture。将光标锁住。不然,鼠标离开button时,就不响应button的消息了。锁住以后就可以。然后判断鼠标位置是否不在button的矩形区域就可以了。最后要ReleaseCapture释放光标。
      

  2.   

    要想有WM_MOUSELEAVE消息必须调用
    BOOL TrackMouseEvent(
      LPTRACKMOUSEEVENT lpEventTrack  // tracking information
    );
    这个API先
      

  3.   

    TrackMouseEvent(  LPTRACKMOUSEEVENT lpEventTrack  );
    参数:
    typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize; //结构大小
    DWORD dwFlags; //设定为TME_LEAVE
    HWND hwndTrack; //要跟踪鼠标的窗口句柄
    DWORD dwHoverTime;} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
    调用该函数可以在鼠标离开指定窗口时收到WM_MOUSELEAVE消息。添加成员变量:m_bOver ,初始化为FALSE。m_bOver=true用来表示鼠标在按钮区域。 
    添加WM_MOUSEMOVE消息处理函数:void CButtonXp::OnMouseMove(UINT nFlags, CPoint point) 
    {
    if(m_bOver ==FALSE)
    {
    //鼠标在按钮之上
    m_bOver =TRUE; //按钮重绘
    InvalidateRect(NULL,FALSE); //跟踪鼠标
    //当鼠标离开按钮区域会收到WM_MOUSELEAVE,该消息直接调用OnMouseOut()
    TRACKMOUSEEVENT tme;
    tme.cbSize =sizeof(TRACKMOUSEEVENT);
    tme.dwFlags =TME_LEAVE;
    tme.dwHoverTime=0;
    tme.hwndTrack =m_hWnd;
    ::TrackMouseEvent(&tme);
    }
    CButton::OnMouseMove(nFlags, point);
    }
    再添加一成员函数OnMouseOut(),
    并在BEGIN_MESSAGE_MAP(CButtonXp, CButton)和END_MESSAGE_MAP()之间添加
    宏 ON_MESSAGE(WM_MOUSELEAVE,OnMouseOut) 
    在OnMouseOut()中写入以下代码void CButtonXp::OnMouseOut ()
    {
    //鼠标已离开按钮区域
        m_bOver =FALSE; //重绘按钮
    InvalidateRect(NULL,FALSE);

    }
      

  4.   

    使用TrackMouseEvent()编译错误,提示 term does not evaluate to a function
    不知是什么原因,请xuanzg(小钢娃) 指教,谢谢