加上SetCapture ,在MouseMove中调用PtInRect判断,离开窗口就ReleaseCapture

解决方案 »

  1.   

    两种方法:
    1.
    void CKeyButton::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    RECT Rect;
    GetClientRect(&Rect);
    if(PtInRect(&Rect,point))
    {
    SetCapture(); //捕获鼠标
    if(m_nClick!=1)
    {
    m_nOldState=m_nState;
    m_nState=1;
    if(m_nOldState!=m_nState)
    this->Invalidate(); //Button redraw
    }
    }
    else
    {
    ReleaseCapture(); //释放鼠标 m_nClick=0;
    m_nState=0;
    this->Invalidate(); //Button redraw
    //AfxMessageBox("bye");
    }
    CButton::OnMouseMove(nFlags, point);
    }或者
    2.
    void CKeyButtonCtrl::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if (m_nState==0)
    {
    // draw with button borders
    m_nState = 1; //设置状态为moveon
    Invalidate();

    TRACKMOUSEEVENT TrackMouseEvent;
    TrackMouseEvent.cbSize = sizeof(TrackMouseEvent);
    TrackMouseEvent.dwFlags = TME_LEAVE;
    TrackMouseEvent.hwndTrack = GetSafeHwnd();
    TrackMouseEvent.dwHoverTime = HOVER_DEFAULT;
    _TrackMouseEvent(&TrackMouseEvent); //捕获mouse leave
    }
    COleControl::OnMouseMove(nFlags, point);
    }
    LONG CKeyButtonCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    m_nState=0; //set normal
    Invalidate(); return 0;
    }