是否可以通过双击禁用文本框选择部分文本

时间:2010-05-18 05:12:07

标签: winforms events textbox

在文本框中双击的默认行为是选择文本的一部分。我想通过选择一个单词来覆盖它。但我发现处理doubleclick事件(或覆盖OnDoubleClick方法)实际上先执行默认行为,然后执行我的代码。是否可以禁用默认行为。

1 个答案:

答案 0 :(得分:1)

看起来你不能使用标准的WinForms事件处理程序(DoubleClickMouseDoubleClick不能给你任何方法来抑制默认行为),但你可以通过创建自定义WndProc并自行处理窗口消息。

在下面的示例中,我覆盖了我创建的PreviewTextBox类中的默认Control.WndProc。我通过此类公开PreviewDoubleClick事件,如果在客户端代码中处理,则可以通过设置e.Handled = true;来禁止默认的双击行为。在此示例中,事件在OnPreviewDoubleClick事件处理程序中处理,您可以在其中添加自定义代码,以便根据需要对双击做出反应。

如果您需要有关双击的其他鼠标信息,我相信您可以通过WndProc中的Message.LParam / Message.WParam字段获取该信息。

(下面的代码假设你已经为已经设置的表单提供了一些代码)

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;
    }
}