2008-08-11 48 views
1

即使從.NET 2.0 TextBox控件中捕獲MouseDown是否有任何方法? 我知道繼承的Control類有事件,但它不在TextBox中公開。 有沒有辦法來重寫事件處理程序?捕獲.NET TextBox的MouseDown事件

我也嘗試了OpenNETCF TextBox2控件,它確實暴露了MouseDown事件,但無論我做什麼,它都不會觸發處理程序。

有什麼建議嗎?


什麼樣的瘋狂的移動設備做 你必須有一個老鼠? :)

是的,Windows Mobile沒有一個實際的鼠標,但你誤以爲Windows Mobile .NET不支持鼠標事件。點擊或在屏幕上移動仍被視爲「鼠標」事件。這樣做是爲了讓代碼可以輕鬆地從完整的Windows移植過來。這不是Windows Mobile的特定問題。 Windows上的TextBox控件也沒有本地鼠標事件。在這種情況下,我碰巧正在使用Windows Mobile。

編輯:另外,由於Windows Mobile是由WindowsCE內核構建的,通常用於嵌入式桌面系統和Slim Terminal Services客戶端或「WinTerms」,它支持硬件鼠標,很長時間。大多數設備根本沒有插上一個在港口。


據.Net框架中, mouseDown事件處理上的一個TextBox 支持。當您嘗試運行代碼時,會發生什麼情況?

其實,那只是因爲有它繼承了它從「控制」一樣,每其他窗體控件。然而,它在TextBox類中被覆蓋(並且改變爲private我相信)。所以它不會在Visual Studio中的IntelliSense中顯示。

然而,實際上,你可以寫代碼:

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown); 

,它會編譯和運行得很好,唯一的問題是,當您點擊TextBox控件textBox1_MouseDown()不會被解僱。我認爲這是因爲內部重寫事件。我甚至不想在內部改變事件的發生,我只想添加我自己的事件處理程序到該事件中,以便我可以像任何其他事件一樣激發一些自定義代碼。

+1

你有什麼樣的瘋狂的移動設備中,有一個老鼠? :)嚴重的是,沒有MouseDown事件的原因是因爲Windows Mobile沒有鼠標。你想在MouseDown事件處理程序中做什麼?也許有另一種方式。 – ageektrapped 2008-08-11 12:46:25

回答

0

不夠公平。您可能比我更瞭解Windows Mobile。 :)我剛開始編程。但是在常規的WinForms中,您可以覆蓋所有您想要的OnXxx事件處理程序方法。使用CF快速查看Reflector顯示Control,TextBoxBase和TextBox不會阻止您重寫OnMouseDown事件處理程序。

你試過嗎?:

public class MyTextBox : TextBox 
{ 
    public MyTextBox() 
    { 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     //do something specific here 
     base.OnMouseDown(e); 
    } 
} 
0

是那裏,你可以捕捉而非 '的OnEnter' 事件?

它大概也會捕獲當你在文本框中鍵入以及通過點擊/點擊進入文本框,但如果這不是問題,那麼這可能是一個更直接的解決方法

2

我知道這個答案是晚了,但希望它最終有用於發現此問題的人。另外,我並沒有完全自己想出來。我相信我最初在OpenNETCF板上找到了大部分的信息,但下面輸入的內容是從我的一個應用程序中提取的。

您可以通過實現OpenNETCF.Windows.Forms.IMessageFilter接口並將其附加到應用程序的消息過濾器來獲取mousedown事件。

 

static class Program { 
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter(); 
    public static void Main() { 
     Application2.AddMessageFilter(mudFilter); 
     Application2.Run(new MainForm()); 
    } 
} 

這是你如何能實現MouseUpDownFilter:

 

public class MouseUpDownFilter : IMessageFilter { 
    List ControlList = new List(); 

    public void WatchControl(Control buttonToWatch) { 
     ControlList.Add(buttonToWatch); 
    } 

    public event MouseEventHandler MouseUp; 
    public event MouseEventHandler MouseDown; 

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) { 
     const int WM_LBUTTONDOWN = 0x0201; 
     const int WM_LBUTTONUP = 0x0202; 

     // If the message code isn't one of the ones we're interested in 
     // then we can stop here 
     if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) { 
      return false; 
     } 

     // see if the control is a watched button 
     foreach (Control c in ControlList) { 
      if (m.HWnd == c.Handle) { 
       int i = (int)m.LParam; 
       int x = i & 0xFFFF; 
       int y = (i >> 16) & 0xFFFF; 
       MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0); 

       if (m.Msg == WM_LBUTTONDOWN) 
        MouseDown(c, args); 
       else 
        MouseUp(c, args); 

       // returning true means we've processed this message 
       return true; 
      } 
     } 
     return false; 
    } 
} 

現在,當他們出現在被監視控制,例如您的文本框此MouseUpDownFilter將火一個的MouseUp/MouseDown事件。要使用此過濾器加一些觀看的控制和分配給它可能會激發你的窗體的Load事件的事件:

 

private void MainForm_Load(object sender, EventArgs e) { 
    Program.mudFilter.WatchControl(this.textBox1); 
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown); 
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp); 
} 

void mudFilter_MouseDown(object sender, MouseEventArgs e) { 
    if (sender == textBox1) { 
     // do what you want to do in the textBox1 mouse down event :) 
    } 

}