2008-10-20 54 views
8

我想重寫OnMouseClick和OnMouseDoubleClick並根據使用的點擊樣式執行不同的操作。如何區分.Net中的單擊和雙擊?

問題是OnMouseClick發生單擊和雙擊,並且在OnMouseDoubleClick之前被調用。

我確定這一定是一個共同的要求,所以我想我錯過了一些非常明顯的東西。有人可以填補我嗎?

編輯即可添加:MouseEventArgs.Clicks數量不起作用。在雙擊的情況下,第一次單擊將在OnMouseClick中以MouseEventArgs.Clicks == 1的形式單擊處理。

編輯以添加:對象是圖像縮略圖。單擊應該打開和關閉導出選擇。雙擊應該使縮略圖全屏。選擇和「激活」動作是正交的。這可能表明一個潛在的問題與這兩個動作......

乾杯, 羅布

+0

您在單擊和雙擊之間執行什麼行爲? Windows標準是單擊=選擇,雙擊=打開,使得單擊選擇「安全」以在打開之前處理... – 2008-10-20 14:08:02

+0

單擊可切換選擇開啓和關閉(選擇要導出的縮略圖)。雙擊激活(使縮略圖全屏)。所以選擇和激活是兩個不同的操作。 – Rob 2008-10-20 14:13:19

+0

但是你想在激活之前選擇,這樣就不會無效地獨立處理它們。另外,在一般用途中,取消選擇是在其他地方點擊,而不是第二次單擊。 – 2008-10-20 14:19:10

回答

12

整個窗戶,會發生。我不認爲他們在.Net中添加了任何特殊的處理方式。

處理這種正常的手段是

  • 一)只是做單一的點擊東西 你想要一個雙 點擊之前發生的,就像選擇。
  • b)如果這不是一個選項,那麼在點擊事件上,啓動一個計時器。在計時器勾號上,執行單擊操作。如果首先發生雙擊事件,則取消定時器,然後執行雙擊操作。

您設置時間的時間量應該等於系統的雙擊時間(用戶可以在控制面板中指定)。它可從System.Windows.Forms.SystemInformation.DoubleClickTime中獲得。詳細信息在MSDN中,here

0

問題是大多數對象不能同時實現這兩個。對於單擊和雙擊,合理具有不同動作的少數對象通常可以在雙擊動作之前運行單擊動作(突出顯示然後打開文件夾,在選擇地址欄之前在地址欄上輸入焦點等)。唯一的確定的方法可能是等待單次點擊一段時間,如果檢測到雙擊,則取消單擊操作。

-1

您可以在OnMouseClick事件處理程序中啓動計時器。

  • 如果計時器超時(比如300ms),那麼只需單擊即可。

否則

  • 如果時間時間之前生成另一個OnMouseClick事件出來,你可以檢查點擊的x & y位置,如果第一次點擊的特定半徑,然後操作中其雙擊功能。

否則

  • 處理第一次點擊和第二點擊重新初始化定時器

注:該實現的事實的優點,無論是timeoput和「雙單擊「半徑可以獨立配置系統配置,允許將軟件導入多臺機器/

0

另一種可能的解決方案是將OnMouseDoubleClick函數調用OnMouseClick。由於OnMouseClick中的操作是二進制切換,因此調用它兩次會將其重置爲相同的狀態。

所以當用戶雙擊時,窗口調用OnMouseClick,然後OnMouseDoubleClick。 OnMouseDoubleClick調用OnMouseClick(再次)恢復狀態,然後處理雙擊。

作爲一種解決方案,這種感覺並不令人滿意,但它很有效。

使用計時器(吞下雙擊的第一次點擊)同樣不令人滿意,並且處理用戶的雙擊率偏好更加複雜。

乾杯, Rob