2008-08-11 17 views
1

.NET 2.0 TextBoxコントロールからMouseDownをキャプチャする方法はありますか? 継承されたControlクラスにはイベントがありますが、TextBoxでは公開されていません。 イベントハンドラをオーバーライドする方法はありますか?.NET TextBoxのMouseDownイベントを取得する

MouseDownイベントが公開されているOpenNETCF TextBox2コントロールも試しましたが、何をしてもハンドラは起動しません。

提案がありますか?あなたはそれがマウスを持って なければならないのクレイジーモバイルデバイスのどのような


? :)

はい、windows mobileには実際のマウスはありませんが、Windows Mobile .NETはMouseイベントをサポートしていないと誤解されています。画面上をクリックまたは移動することは、依然として「マウス」イベントとみなされます。このようにして、コードを完全なWindowsから簡単に移植できるようになりました。これはWindows Mobile固有の問題ではありません。 WindowsのTextBoxコントロールにはネイティブマウスイベントもありません。私はちょうどこの場合にWindows Mobileを使用していた。

編集:そしてサイドノート... Windows Mobileは組み込みデスクトップシステムやSlim Terminal Servicesクライアント(WinTerms)によく使用されるWindowsCEコアで構築されているため、ハードウェアマウスをサポートしています。長い間。ほとんどのデバイスはただで1を接続するポートはありません。


の.NET Frameworkによると、テキストボックス 上 のMouseDownイベントハンドラがサポートされています。 コードを実行しようとするとどうなりますか? おき他のフォームのコントロールも同様で

実は、それは、唯一そこには「コントロール」からそれを継承するためです。しかし、それはTextBoxクラスでオーバーライドされています。したがって、Visual StudioのIntelliSenseには表示されません。

しかし、あなたが実際にコードを書くことができます。

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

をし、それだけで罰金をコンパイルして実行されます、唯一の問題は、TextBoxコントロールをタップするとtextBox1_MouseDown()が発射されないことです。これは、イベントが内部的にオーバーライドされているためと考えられます。私はイベントの内部で何が起こっているのかを内部的に変更したくないので、他のイベントと同様に独自のイベントハンドラを追加してカスタムコードを起動することができます。

+1

どのようなクレイジーモバイルデバイスにマウスがありますか? :)真剣に、MouseDownイベントがない理由は、Windows Mobileにマウスがないためです。 MouseDownイベントハンドラで何をしようとしていますか?多分別の方法があります。 – ageektrapped

答えて

0

あなたが正しいように見えます。バマー。 MouseOverイベントはありません。

しかし、常に.NETで動作するフォールバックの1つは、P/Invokeです。誰かがすでに.NET CF TextBoxのためにこれを行う時間がかかりました。私はCodeProjectの上でこれを見つけた:

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

希望これはあなたの代わりに取り込むことができ「フォーカス取得時」イベントがある

0

十分に適切です。あなたはおそらく私がWindows Mobileについてもっと多く知っているでしょう。 :)私はちょうどそれのためにプログラミングを始めた。しかし、通常のWinFormsでは、必要なすべてのOnXxxイベントハンドラメソッドをオーバーライドできます。 ReflectorをCFで簡単に見てみると、Control、TextBoxBase、TextBoxはOnMouseDownイベントハンドラをオーバーライドできないことを示していません。

これを試しましたか?:

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

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

役立ちますか?

テキストボックスにタブするだけでなく、タップ/クリックしてテキストボックスを入力すると、おそらくキャプチャされますが、それでも問題がなければ、これはもっと簡単な回避策になります

2

私はこの答えが遅くなることを知っていますが、うまくいけば、これを見つけた人にとって有益なものになります。また、私はそれだけで自分自身を思いついたわけではありません。私はもともとOpenNETCFボードの情報のほとんどを見つけたと信じていますが、以下に入力されているものは私のアプリケーションから抽出されています。

mousedownイベントを取得するには、OpenNETCF.Windows.Forms.IMessageFilterインターフェイスを実装し、アプリケーションのメッセージフィルタにそれを接続します。

 

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イベントを発生させます。このフィルタを使用するには、監視対象のコントロールを追加し、フォームのロードイベントで発生する可能性のあるイベントに割り当てます。

 

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 :) 
    } 

} 

関連する問題