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);
}