今天在編寫一個win32的程式時,遇到了一個問題,那就是在我響應滑鼠雙擊這個事件時,先響應了按一下滑鼠這個事件。於是下決心解決這個問題。後來才明白,滑鼠雙擊是由兩次滑鼠的單擊組成的,只不過windows通過判斷兩次按一下滑鼠的時間,如果兩次按一下滑鼠在200ms之內,則說明是滑鼠雙擊事件,如果超過了200ms,則說明是滑鼠的兩次單機事件。那麼如何在響應滑鼠雙擊的同時不響應按一下滑鼠事件呢?也就是過濾掉滑鼠的單擊事件。有兩種方法可以實現。
(1) 在WM_LBUTTONDOWN這個訊息響應中加入下面的過濾條件
DWORD st;
DWORD et;
MSG msg;
st = GetTickCount();
while(1)
{
if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
::TranslateMessage(&msg);
::DisatchMessage(&msg);}
if(WM_LBUTTONDBLCLK == msg.message)
{
return DefWindowProc(hWnd,message,wParam,lParam);
}
et = GetTickCount();if(et - st > 200)break;}
這樣就可以在響應滑鼠雙擊的訊息時,不響應按一下滑鼠的響應。
(2) 使用Sleep(GetDoubleClickTime())在WM_LBUTTONDOWN訊息響應中加入
static bool flag = FALSE;
Sleep(GetDoubleClickTime());
if(flag){ return 0;}
flag = false;
然後在WM_LBUTTONDBLCLK中加入
flag = true;
這樣的目的是:當使用者雙擊滑鼠時,先進入的是WM_LBUTTONDOWN這個訊息響應,
Sleep(GetDoubleClickTime())後,
訊息響應會進入WM_LBUTTONDBLCLK,這個時候flag變成了true,
等sleep結束後,訊息繼續回到LBUTTONDOWN中,
這個時候判斷flag的值是true就會返回。希望這篇文章能協助需要的人解決問題。