2010-05-18 44 views

回答

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

太棒了!有用。非常感谢你! – leon 2010-05-18 10:28:58

相关问题