1

是否有任何方法可以从 .NET 2.0 TextBox 控件中捕获 MouseDown?我知道继承的 Control 类有事件,但它没有在 TextBox 中公开。有没有办法覆盖事件处理程序?

我还尝试了 OpenNETCF TextBox2 控件,它确实暴露了 MouseDown 事件,但无论我做什么,它都不会触发处理程序。

有什么建议么?


你有什么样的疯狂移动设备,有鼠标?:)

是的,windows mobile 没有真正的鼠标,但您误认为 Windows Mobile .NET 不支持鼠标事件。屏幕上的单击或移动仍被视为“鼠标”事件。这样做是为了让代码可以轻松地从完整的 Windows 移植过来。这不是 Windows Mobile 特定的问题。Windows 上的 TextBox 控件也没有本机鼠标事件。在这种情况下,我只是碰巧使用了 Windows Mobile。

编辑:附带说明...由于 Windows Mobile 是由 WindowsCE 核心构建的,该核心通常用于嵌入式桌面系统和 Slim Terminal Services 客户端或“WinTerms”,它支持硬件鼠标并且已经使用了很长时间。大多数设备只是没有可以插入的端口。


根据 .Net Framework,支持 TextBox 上的 MouseDown 事件处理程序。当您尝试运行代码时会发生什么?

实际上,那只是因为它从“Control”继承它,就像所有其他 Form 控件一样。但是,它在 TextBox 类中被覆盖(并且我相信已更改为私有)。所以它不会出现在 Visual Studio 的 IntelliSense 中。

但是,您实际上可以编写代码:

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

它会编译并运行得很好,唯一的问题是当您点击 TextBox 控件时不会触发 textBox1_MouseDown() 。我认为这是因为事件在内部被覆盖。我什至不想在内部更改事件中发生的事情,我只想将我自己的事件处理程序添加到该事件中,这样我就可以像处理任何其他事件一样触发一些自定义代码。

4

5 回答 5

2

我知道这个答案已经晚了,但希望它最终对找到这个答案的人有用。另外,我自己也没有完全想出来。我相信我最初在 OpenNETCF 板上找到了大部分信息,但下面输入的内容是从我的一个应用程序中提取的。

您可以通过实现 OpenNETCF.Windows.Forms.IMessageFilter 接口并将其附加到应用程序的消息过滤器来获取 mousedown 事件。

静态类程序{
    公共静态 MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    公共静态无效主要(){
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

这就是实现 MouseUpDownFilter 的方法:

公共类 MouseUpDownFilter : IMessageFilter {
    列表控制列表 = 新列表();

    公共无效WatchControl(控制buttonToWatch){
        ControlList.Add(buttonToWatch);
    }

    公共事件 MouseEventHandler MouseUp;
    公共事件 MouseEventHandler MouseDown;

    公共布尔 PreFilterMessage(参考 Microsoft.WindowsCE.Forms.Message m){
        常量 int WM_LBUTTONDOWN = 0x0201;
        常量 int WM_LBUTTONUP = 0x0202;

        // 如果消息代码不是我们感兴趣的代码之一
        // 那么我们可以在这里停下来
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            返回假;
        }

        // 查看控件是否为被监视按钮
        foreach (ControlList 中的控制 c) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                诠释 x = 我 & 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 表示我们已经处理了这条消息
                返回真;
            }
        }
        返回假;
    }
}

现在,此 MouseUpDownFilter 将在监视控件(例如您的文本框)上发生时触发 MouseUp/MouseDown 事件。要使用此过滤器,您需要添加一些监视控件并分配给它可能在表单的加载事件中触发的事件:

私人无效MainForm_Load(对象发送者,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){
    如果(发件人 == textBox1){
        // 在 textBox1 鼠标按下事件中做你想做的事情 :)
    }

}

于 2009-08-10T14:38:56.423 回答
0

根据 .Net Framework,支持TextBox 上的 MouseDown 事件处理程序。当您尝试运行代码时会发生什么?

于 2008-08-11T13:54:46.793 回答
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);
    }
}
于 2008-08-11T14:02:17.387 回答
0

看起来你是对的。真可惜。没有 MouseOver 事件。

但是,始终适用于 .NET 的一种备用方法是 P/Invoke。已经有人花时间为 .NET CF TextBox 做这件事了。我在 CodeProject 上找到了这个:

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

希望这可以帮助

于 2008-08-11T14:45:05.957 回答
0

是否有您可以捕获的“OnEnter”事件?

当您进入文本框以及通过点击/单击它输入文本框时,它可能也会捕获,但如果这不是问题,那么这可能是一个更直接的解决方法

于 2008-09-19T13:45:09.630 回答