MFC:Windows如何區分滑鼠雙擊和兩次單擊

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.