在文本框中双击的默认行为是选择文本的一部分。我想通过选择一个单词来覆盖它。但我发现处理doubleclick事件(或覆盖OnDoubleClick方法)实际上先执行默认行为,然后执行我的代码。是否可以禁用默认行为。
答案 0 :(得分:1)
看起来你不能使用标准的WinForms事件处理程序(DoubleClick
和MouseDoubleClick
不能给你任何方法来抑制默认行为),但你可以通过创建自定义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;
}
}