2012-09-25 76 views
0

我用下面的代碼進行試驗:鼠標滾輪不會觸發事件,因爲文本框搶斷焦點

public Form1() 
{ 
    InitializeComponent(); 
    this.MouseWheel += new MouseEventHandler(Form1_MouseWheel); 
} 

private void Form1_MouseWheel(object sender, MouseEventArgs e) 
{ 
    textBox1.Text += "delta : " + e.Delta + "\r\n"; 
} 

但事件似乎從來不火。然後我注意到,表格一出現,文本框就得到了重點,事實上,在我刪除它之後,該事件開始運作。

現在,問題:

  1. 我怎樣才能讓事件觸發時窗體是頂級窗口, 即使我有它一個textarea?
  2. 我應該簡單地將相同的事件添加到textarea,還是有一個簡單的方法來做到這一點,我看不到?
  3. 有沒有辦法等待「滾輪滾動」結束,然後讓 事件發生?我需要成倍增加的整數值 基於多久車輪已經鋪開
+0

這是否也發生在鼠標位於textarea之外?您可以重寫textarea對象的MouseWheel事件,並讓它調用您的窗體MouseWheel事件。 – MrFox

+0

是的,它發生在鼠標所在的位置。覆蓋textarea的MouseWheel事件是我想到的解決方案,但我希望有一些「更簡單」:在複雜的用戶界面中,我可能會有很多組件偷取焦點,這會讓我唯一的選項覆蓋每一個? – kaharas

+0

再說一次,如果某些組件沒有MouseWheel事件,但可以獲得焦點呢? – kaharas

回答

0

的Form1_MouseWheel添加到窗體和文本框(或可能僅文本框) 在這段代碼中所有鼠標滾輪運動內部一秒鐘後彼此屬於同一系列。

public partial class Form1 : Form 
{ 
    private Timer second = new Timer(); 
    private int wheelMoves = 0; 

    public Form1() 
    { 
     second.Interval = 1000; 
     second.Tick += new EventHandler(second_Tick); 
     InitializeComponent(); 
    } 

    void second_Tick(object sender, EventArgs e) 
    { 
     second.Stop(); 
     // DoStuff with wheelmoves. 
     textBox1.Text = wheelMoves.ToString() + " " + (wheelMoves * wheelMoves).ToString(); 
     wheelMoves = 0; 
    } 

    void Form1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     // reset the timer. 
     second.Stop(); 
     second.Start(); 
     // Count the number of times the wheel moved. 
     wheelMoves++; 
    } 
} 

編輯:如果您添加另一個控件並使其竊取焦點,則不必將事件處理程序添加到文本框中。這使文本框滾動功能保持不變,並且還調用自定義MouseWheel事件。

0

這裏最可能的情況是文本框會自動竊取焦點,因爲操作系統可能會自動假定任何鼠標滾輪滾動指向它(因爲它是唯一可用的文本編輯控件)。

可能的解決方案:

  1. 爲您的文本框說
  2. 你可能會迫使創建一個永遠不能憑藉它在自定義使用SetStyle接收焦點一個文本框,您可以添加鼠標滾輪事件textbox class like this:
 
class unfocusableTextBox : TextBox 
    { 
     public unfocusableTextBox(){ 
       SetStyle(ControlStyles.Selectable, false); 
     } 
    } 
+0

這些屬性是隻讀的,添加標籤並讓它佔據焦點確實有幫助。 – MrFox

+0

哎呀,謝謝你的提醒。 –

相關問題