標籤:style blog class http c width
在Windows平台上,滑鼠左鍵的按下、鬆開、快速的兩次點擊會產生WM_LBUTTONDOWN、WM_LBUTTONUP和WM_LBUTTONDBLCLK訊息,但是Windows根據什麼來區分連續的兩次滑鼠按鍵動作,是兩次獨立的單擊,還是一次雙擊呢?最近在解決一個問題時,通過使用Spy++和查閱MSDN,弄清楚了這個問題。簡單總結如下:
Windows根據兩個條件來做這個區分:
(1)雙擊的時間間隔
這是很容易想到的。更準確的說法是這樣的,兩次單擊會產生四個滑鼠點擊訊息,如果第三個訊息(第二次按下)和第二個訊息(第一次彈起引發的WM_LBUTTONUP)間隔短於指定值,則把第三個訊息處理成WM_LBUTTONDBLCLK訊息;第四個訊息照舊,WM_LBUTTONUP。
這個指定的時間間隔,在Windows XP SP2上預設是0.5秒,其他動作系統可能相同。通過::GetDoubleClickTime調用可以得到這個值。
這個值是可以設定的。有兩種方法設定這個值: ::SetDoubleClickTime調用,或者以SPI_SETDOUBLECLICKTIME為第一個參數調用::SystemParametersInfo。設定的結果對系統中其他的應用程式也起作用。
(2)兩次滑鼠擊點的空間距離
在第一次點擊時,Windows以擊點為中心,檢測一個矩形地區,如果第二次點擊不落在這個地區內,那就不把第三個訊息算作WM_LBUTTONDBLCLK訊息。
這個矩形地區的預設大小,在Windows XP SP2上預設是4pt×4pt。可以以SM_CXDOUBLECLK或SM_CYDOUBLECLK為參數調用::GetSystemMetrics得到。
這個值也是可以設定的。設定的方法是通過SPI_SETDOUBLECLKWIDTH或SPI_SETDOUBLECLKHEIGHT為第一個參數來調用::SystemParametersInfo。設定的結果對系統中其他的應用程式也起作用。
因此,連續兩次按下和彈起滑鼠左鍵:
如果不符合以上兩個條件,產生的訊息是:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDOWN
WM_LBUTTONUP
如果符合以上兩個條件,產生的訊息則是:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
以上結論還隱含兩個要點:
(1)不管是算作兩次連續的單擊,還是一次雙擊,第一、二和四個訊息都是不受影響的。在接受到一個雙擊訊息之前,應用程式總是會先收到一個WM_LBUTTONDOWN和一個WM_LBUTTONUP訊息,之後是WM_LBUTTONUP訊息。應用程式應該對各種訊息做出恰當的處理;
(2)第二個訊息和第三個訊息是關鍵,必須被連續發到同一個視窗過程才能被處理。開發中常見的一個錯誤是這樣的:在處理第一個訊息WM_LBUTTONDOWN或者WM_LBUTTONUP時,通過SetCapture捕獲後續的滑鼠訊息,轉寄到別的視窗,導致原視窗不能識別雙擊,而這個雙擊可能正是期望的。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/cnike/archive/2009/11/25/4870064.aspx