1

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

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

助言がありますか?


マウスを搭載した、どのようなクレイジーなモバイルデバイスがありますか?:)

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

編集:補足として... Windows Mobileは、組み込みデスクトップシステムやスリムターミナルサービスクライアントまたは「WinTerms」でよく使用されるWindowsCEコアで構築されているため、ハードウェアマウスをサポートしており、長い間使用されています。ほとんどのデバイスには、プラグを差し込むためのポートがありません。


.Net Frameworkによると、TextBoxのMouseDownイベントハンドラーがサポートされています。コードを実行しようとするとどうなりますか?

実際には、他のすべてのフォームコントロールと同様に、「コントロール」から継承するため、これだけが存在します。ただし、TextBoxクラスではオーバーライドされます(そして私が信じるプライベートに変更されます)。そのため、VisualStudioのIntelliSenseには表示されません。

ただし、実際には次のコードを記述できます。

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

コンパイルして正常に実行されます。唯一の問題は、TextBoxコントロールをタップしたときにtextBox1_MouseDown()が起動されないことです。これは、イベントが内部でオーバーライドされているためだと思います。イベントで何が起こっているかを内部で変更することすらしたくありません。他のイベントと同じようにカスタムコードを起動できるように、そのイベントに独自のイベントハンドラーを追加したいだけです。

4

5 に答える 5

2

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

OpenNETCF.Windows.Forms.IMessageFilterインターフェイスを実装し、それをアプリケーションのメッセージフィルターにアタッチすることで、マウスダウンイベントを取得できます。

静的クラスプログラム{
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main(){
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

これは、MouseUpDownFilterを実装する方法です。

パブリッククラスMouseUpDownFilter:IMessageFilter {
    リストControlList=new List();

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

    パブリックイベントMouseEventHandlerMouseUp;
    パブリックイベントMouseEventHandlerMouseDown;

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

        //メッセージコードが私たちが興味を持っているものの1つではない場合
        //ここで停止できます
        if(m.Msg!= WM_LBUTTONDOWN && m.Msg!= WM_LBUTTONDOWN){
            falseを返します。
        }

        //コントロールが監視ボタンかどうかを確認します
        foreach(ControlListのControl c){
            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);
                そうしないと
                    MouseUp(c、args);

                // trueを返すということは、このメッセージを処理したことを意味します
                trueを返します。
            }
        }
        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(オブジェクト送信者、MouseEventArgs e){
    if(sender == textBox1){
        //textBox1マウスダウンイベントでやりたいことをします:)
    }

}

于 2009-08-10T14:38:56.423 に答える
0

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

ただし、.NETで常に機能するフォールバックの1つは、P/Invokeです。誰かがすでに.NETCFTextBoxに対してこれを行うのに時間をかけました。私はこれをCodeProjectで見つけました:

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

お役に立てれば

于 2008-08-11T14:45:05.957 に答える
0

.Net Frameworkによると、TextBoxのMouseDownイベントハンドラーがサポートされています。コードを実行しようとするとどうなりますか?

于 2008-08-11T13:54:46.793 に答える
0

けっこうだ。あなたはおそらく私がWindowsMo​​bileについて知っている以上のことを知っているでしょう。:)私はちょうどそれのためにプログラミングを始めました。ただし、通常の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);
    }
}
于 2008-08-11T14:02:17.387 に答える
0

代わりにキャプチャできる「OnEnter」イベントはありますか?

おそらく、テキストボックスにタブで移動したり、テキストボックスをタップ/クリックして入力したりするときにもキャプチャされますが、それが問題にならない場合は、これがより簡単な回避策になる可能性があります

于 2008-09-19T13:45:09.630 に答える