Захват события MouseDown для .NET TextBox - PullRequest
1 голос
/ 11 августа 2008

Есть ли способ захватить MouseDown даже из элемента управления .NET 2.0 TextBox? Я знаю, что унаследованный класс Control имеет событие, но оно не отображается в TextBox. Есть ли способ переопределить обработчик событий?

Я также попробовал элемент управления OpenNETCF TextBox2, в котором выставлено событие MouseDown, но независимо от того, что я делаю, он не запускает обработчик.

Есть предложения?


Что за сумасшедшее мобильное устройство у вас есть мышь? :)

Да, Windows Mobile не имеет реальной мыши, но вы ошибаетесь, что Windows Mobile .NET не поддерживает события мыши. Щелчок или перемещение по экрану все еще считается событием «Мышь». Это было сделано таким образом, чтобы код мог легко переноситься с полной версии Windows. И это не проблема Windows Mobile. Элемент управления TextBox в Windows также не имеет собственных событий мыши. Мне просто довелось использовать Windows Mobile в этом случае.

Редактировать: И на заметку ... поскольку Windows Mobile построена на ядре WindowsCE, которое часто используется для встроенных настольных систем и клиентов Slim Terminal Services или "WinTerms", она поддерживает аппаратную мышь и имеет для много времени. У большинства устройств просто нет портов для подключения.


Согласно .Net Framework, Обработчик событий MouseDown в TextBox поддерживается. Что происходит, когда ты попробовать запустить код?

На самом деле, это только там, потому что он наследует его от "Control", как и каждый другой элемент управления Form. Однако он переопределен (и, как я полагаю, изменен на приватный) в классе TextBox. Поэтому он не будет отображаться в IntelliSense в Visual Studio.

Однако вы можете написать код:

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

и он будет прекрасно скомпилирован и запущен, единственная проблема в том, что textBox1_MouseDown () не будет запущен при нажатии элемента управления TextBox. Я предполагаю, что это из-за того, что Событие переопределено внутри Я даже не хочу изменять то, что происходит внутри события, я просто хочу добавить к этому событию свой собственный обработчик событий, чтобы я мог запускать некоторый пользовательский код, как вы могли бы с любым другим событием.

Ответы [ 5 ]

2 голосов
/ 10 августа 2009

Я знаю, что этот ответ слишком поздно, но, надеюсь, он окажется полезным для того, кто его найдет. Кроме того, я не совсем придумал это сам. Я считаю, что изначально я нашел большую часть информации на платах 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 :)
    }

}

0 голосов
/ 19 сентября 2008

есть ли событие 'OnEnter', которое вы могли бы захватить вместо этого?

это, вероятно, также будет записываться, когда вы вкладываете в текстовое поле, а также вводите текстовое поле, нажимая на него / нажимая на него, но если это не проблема, то это может быть более простым решением

0 голосов
/ 11 августа 2008

Достаточно справедливо. Вы, наверное, знаете больше, чем я, о 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 голосов
/ 11 августа 2008

Похоже, ты прав. Облом. Событие MouseOver отсутствует.

Одним из резервных вариантов, который всегда работает с .NET, является P / Invoke. Кто-то уже нашел время, чтобы сделать это для .NET CF TextBox. Я нашел это на CodeProject:

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

Надеюсь, это поможет

0 голосов
/ 11 августа 2008

В соответствии с .Net Framework поддерживается обработчик событий MouseDown в TextBox . Что происходит, когда вы пытаетесь запустить код?

...