您可以使用 MouseDoubleClick,但该事件不会通过 Design 接口公开。要使用它,将以下行添加到构造函数或表单的加载事件中:
checkBox1.MouseDoubleClick += new MouseEventHandler(checkBox1_MouseDoubleClick);
这假定一个 checkBox1.MouseDoubleClick 方法,如下所示:
void checkBox1_MouseDoubleClick(对象发送者,MouseEventArgs e)
{
抛出新的 NotImplementedException();
}
好的,最后一个例子不起作用,你是对的; DoubleClick 事件永远不会引发。所以,这可能有点“hacky”,但会起作用:
扩展CheckBox 类,例如创建一个CheckboxExtended 类。在这个类中,我们重写了WndProc 方法并拦截windows 双击消息。示例代码如下:
public class CheckBoxExtended : CheckBox
{
private const int WM_LBUTTONDBLCLK = 0x203;
protected override void WndProc(ref Message m)
{
// Threat the message first
if (m.Msg == WM_LBUTTONDBLCLK)
{
var lparam = m.LParam.ToInt32();
var x = lparam & 0x0000FFFF;
var y = (int) ((lparam & 0xFFFF0000) >> 16);
OnMouseDoubleClick(new MouseEventArgs(MouseButtons.Left, 2, x, y, 0));
}
base.WndProc(ref m);
}
}
我仍然不确定解析 LParam 以获得鼠标位置。请给我几秒钟的时间。
要使用这个类,就像我之前说的那样做:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
checkBoxExtended1.MouseDoubleClick += new MouseEventHandler(checkBoxExtended1_MouseDoubleClick);
}
void checkBoxExtended1_MouseDoubleClick(object sender, MouseEventArgs e)
{
MessageBox.Show(@"Test");
}
}
当然,我假设一个带有CheckBoxExtended 的表单。
编辑:哎呀,我刚刚发现我使用的是二进制文件或而不是二进制文件和。现在源是固定的,应该返回正确的坐标。
编辑 2: 好的,我已经在 VB 中创建了这个类,但我还没有测试过——我在 VB 中的技能也不是很好。一个提示:您可以自己为扩展类编写另一个 DoubleClick 事件,并添加必要的装饰(属性)以使设计器能够显示它。
Public Class CheckboxExtended
Inherits CheckBox
Private Const WM_LBUTTONDBLCLK As Integer = &H203
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
'Threat the message first
If m.Msg = WM_LBUTTONDBLCLK Then
Dim lparam = m.LParam.ToInt32()
Dim x = lparam And &HFFFF
Dim y = ((lparam And &HFFFF0000) >> 16)
OnMouseDoubleClick(New MouseEventArgs(MouseButtons.Left, 2, x, y, 0))
End If
MyBase.WndProc(m)
End Sub
End Class