Можно ли отключить текстовое поле от выбора части текста с помощью двойного щелчка - PullRequest
2 голосов
/ 18 мая 2010

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

1 Ответ

1 голос
/ 18 мая 2010

Не похоже, что вы можете сделать это с помощью стандартных обработчиков событий WinForms (DoubleClick и MouseDoubleClick не дают вам способа подавить поведение по умолчанию), но вы можете сделать это, создав пользовательский WndProc и обрабатывать оконные сообщения самостоятельно.

В приведенном ниже примере я переопределяю значение по умолчанию Control.WndProc в создаваемом мной классе PreviewTextBox. Через этот класс я раскрываю событие PreviewDoubleClick, которое, если обрабатывается в клиентском коде, может использоваться для подавления поведения двойного щелчка по умолчанию, задав e.Handled = true;. В этом примере событие обрабатывается в обработчике события OnPreviewDoubleClick, где вы можете добавить свой собственный код, чтобы реагировать на двойной щелчок, как вам угодно.

Если вам нужна дополнительная информация о двойном щелчке мышью, я думаю, вы можете получить ее через поля Message.LParam / Message.WParam в WndProc.

(код ниже предполагает, что у вас есть некоторый код для уже настроенной формы)

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    class DoubleClickEventArgs : EventArgs
    {
        public bool Handled
        {
            get;
            set;
        }
    }

    class PreviewTextBox : TextBox
    {
        public event EventHandler<DoubleClickEventArgs> PreviewDoubleClick;

        protected override void WndProc(ref Message m)
        {
            if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK))
            {
                var e = new DoubleClickEventArgs();

                if (PreviewDoubleClick != null)
                    PreviewDoubleClick(this, e);

                if (e.Handled)
                    return;
            }

            base.WndProc(ref m);
        }

        const int WM_DBLCLICK = 0xA3;
        const int WM_LBUTTONDBLCLK = 0x203;
    }

    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();

            _textBox = new PreviewTextBox();
            _textBox.Text = "Test text foo bar";
            _textBox.PreviewDoubleClick += new EventHandler<DoubleClickEventArgs>(OnPreviewDoubleClick);

            Controls.Add(_textBox);
        }

        void OnPreviewDoubleClick(object sender, DoubleClickEventArgs e)
        {
            e.Handled = true;
        }

        PreviewTextBox _textBox;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...