Re: How to differ mouse click and drag?
 
Mouse is very sensetive. You have to keep the mouse completely still while
you click. So give it a little buffer to move before you start your
operation.
That is some intersting code. May I ask why your letting the message pump
take care of all of this?
void CMouseCaptureView::OnLButtonDown(nFlag,point)
{
        m_Point = point;
}
void CMouseCaptureView::OnMouseMove(nFlag,point)
{
    if (nFlag & MK_LBUTTON)
    {
        //since mouse moves happen often lets give this thing a little
buffer
        if (point is past 2 or 3 pixels from m_Point)
        {
            //this could go into LButtonDown
            SetCapture();
            SetTimer(...);
            m_Captured = TRUE;
        }
    }
}
void CMouseCaptureView::OnLButtonUp()
{
    if (m_Captured)
    {
        ReleaseCapture();
        m_Captured = FALSE;
    }
}
"vicky" <ziashahid123@gmail.com> wrote in message
news:1174287755.596353.110580@o5g2000hsb.googlegroups.com...
Hi All!
I am having a problem regarding mouse capture. I am capturing mouse
events in my LBUTTONDOWN Handler but i am unable to differ between
click (Mouse down and UP) and drag(Mouse down -> move -> up).
When i am expecting single click windows fires mouse move too. at
first time it runs fine but for subsequent clicks it gives me msg
"Mouse L-Button UP, After Mouse Move.".
What to do now?
Following is my code in which i am capturing mouse events on
LBUTTONDOWN handler.
void CMouseCaptureView::OnLButtonDown(UINT nFlags, CPoint point)
{
  CPoint pt;
  for (;;)
  {
     MSG msg;
     ::GetMessage(&msg,NULL,0,0);
     CWnd *pwnd =  AfxGetApp()->GetMainWnd();
     HWND hwnd = pwnd->GetSafeHwnd();
     switch(msg.message)
     {
     case WM_MOUSEMOVE:
        RECT rc;
        bMove = TRUE;
        pt = msg.lParam ;
        GetWindowRect(&rc);
        if(PtInRect(&rc,pt))
        {
           SetTimer(TID_POLLMOUSE,MOUSE_POLL_DELAY,NULL);
           if(hwnd != GetCapture()->GetSafeHwnd() )
           {
              SetCapture();
           }
           break;
        }
        break;
     case WM_LBUTTONUP:
        if(bMove)
        {
           bMove = FALSE;
           AfxMessageBox("Mouse L-Button UP, After Mouse Move.");
        }
        else
           AfxMessageBox("Mouse L-Button UP.");
        ReleaseCapture();
        KillTimer(TID_POLLMOUSE);
        PostMessage(WM_MOUSELEAVE,0,0L);
        break;
     case WM_TIMER:
        GetWindowRect(&rc);
        GetCursorPos(&pt);
        if(PtInRect(&rc,pt))
        {
        PostMessage(WM_MOUSEHOVER,0,0L);
        break;
        }
        ReleaseCapture();
        KillTimer(TID_POLLMOUSE);
        PostMessage(WM_MOUSELEAVE,0,0L);
        break;
     default:
        DispatchMessage(&msg);
     }//End of switch
     // release the mouse (if we still own it)
     if (GetCapture() == this) ::ReleaseCapture();
  }//End of For
  CView::OnLButtonDown(nFlags, point);
}