2010-03-02 95 views
1

我想限制區域內的鼠標點擊,如果區域內有任何控件,它應該允許鼠標點擊。要限制鼠標點擊

如何做到這一點

+0

Web窗體? Windows窗體? MVC? – jrista 2010-03-02 06:54:39

+0

窗口形式 – curiosity 2010-03-02 06:57:17

回答

0

您可能需要捕獲鼠標,除了處理鼠標向下/向上的消息。

不幸的是,捕獲鼠標的最好方法是觀察WM_CAPTURECHANGED消息,這意味着我們需要進入Win32 API來監視此事件,因爲Windows窗體沒有定義相應的事件。 例如,爲了處理這種的Win32消息,第一你定義一個內部類來處理低級消息WM_CAPTURECHANGED,並定義事件處理程序:

public partial class Form1 : Form 
{ 
    class CaptureChangedWindow : NativeWindow 
    { 
     public CaptureChanged OnCaptureChanged; 

     protected override void WndProc(ref Message m) 
     { 
      if (m.Msg == 533)  // WM_CAPTURECHANGED 
       OnCaptureChanged(); 
      base.WndProc(ref m); 
     } 
    } 
    public delegate void CaptureChanged(); 
    ... 
} 

接下來聲明一個成員字段來保存CaptureChangedWindow實例:

public partial class Form1 : Form 
{ 
    CaptureChangedWindow ccw; 
    ... 
} 

接着定義當調用CaptureChanged代表將被調用的方法:

public partial class Form1 : Form 
{ 

    private void CaptureChangedEventHandler() 
    { 
     // your code 
     // e.g. now it's safe to assume that mouse is captured 
    } 
    ... 
} 

最後,修改構造函數以創建並初始化嵌套類:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     ccw = new CaptureChangedWindow(); 
     ccw.AssignHandle(Handle); 
     ccw.OnCaptureChanged += 
        new CaptureChanged(CaptureChangedEventHandler); 
    } 
    ... 
} 

這就是你所需要的。然後,您可以像平常一樣處理其他鼠標事件。

+0

嘿謝謝告訴我的概念..這是我正在尋找.. – curiosity 2010-03-02 07:33:53

1

在您的形式,覆蓋WndProc方法,處理鼠標左鍵消息,如果它是公認的區域,調用基類,否則吞消息(即不叫基類)

1

您只是不響應該區域的mouseclick事件並實現其子控件的事件。

或者我不明白你的意思。