2014-06-11 46 views
3

我有一個按鈕,並在鼠標輸入時彈出一個小窗體,並在按鈕的mouseleave時,小窗體消失。我需要這種形式不接受任何鼠標事件,換句話說,對鼠標是「不可見的」。在winforms中,我如何使控件不接受鼠標事件

問題是,窗體在鼠標下彈出,觸發按鈕的mouseleave事件。我知道還有其他方法可以解決這個問題,但是當鼠標離開觸發表單的原始按鈕時,我需要隱藏窗體,而且我還需要將窗體顯示在鼠標下面。

那麼如何讓鼠標事件不可見的小彈出窗體,以便它不會導致按鈕觸發「鼠標離開」事件?

彈出窗口是「窗體」類型。這裏是觸發顯示和隱藏形式的mouseenter和鼠標離開代碼:

private void btnPatientSearch_MouseEnter(object sender, EventArgs e) 
     { 
       _currentPatientInfo = new PatientInfo() 
       { 
        MdiParent = this.MdiParent 
       }; 
       _currentPatientInfo.Show(); 
       _currentPatientInfo.Location = new Point(181, 9); 
      } 
     } 

     private void btnPatientSearch_MouseLeave(object sender, EventArgs e) 
     { 
      if (_currentPatientInfo == null) return; 
      _currentPatientInfo.Hide(); 
      _currentPatientInfo = null; 
     } 
+0

是彈出不可見的,還是繪製在指針?當你看看form1.designer.cs它在哪裏有框被繪製。或者更好的是,你可以修改帖子並添加自動生成的代碼爲彈出?又是什麼?它是一個面板嗎?你可以發佈按鈕的鼠標事件嗎? – alykins

+0

好的,我添加了mouseenter和mouseleave代碼。設計師生成的代碼非常多。 –

+0

添加btnPatientSearch.Capture = true;在MouseEnter事件處理程序中。 –

回答

1

繼承下面的表格類的彈出的形式。這段代碼使用了一些p/invokes而沒有經過測試,但它應該可以工作。

public class PopupForm : Form 
{ 
    private const int WS_BORDER = 0x00800000; 
    private const int WS_POPUP = unchecked((int)0x80000000); 

    private const int WS_EX_TOPMOST = 0x00000008; 
    private const int WS_EX_NOACTIVATE = 0x08000000; 

    private const int WM_MOUSEACTIVATE = 0x0021; 
    private const int MA_NOACTIVATEANDEAT = 4; 

    private static readonly IntPtr HWND_TOPMOST = (IntPtr)(-1); 

    private const int SWP_NOSIZE = 0x0001; 
    private const int SWP_NOMOVE = 0x0002; 
    private const int SWP_NOACTIVATE = 0x0010; 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, 
    int X, int Y, int cx, int cy, int uFlags); 

    public PopupForm() 
    { 
    SetStyle(ControlStyles.Selectable, false); 
    FormBorderStyle = FormBorderStyle.None; 
    StartPosition = FormStartPosition.Manual; 
    ShowInTaskbar = false; 
    Visible = false; 
    } 

    protected override CreateParams CreateParams 
    { 
    get 
    { 
     CreateParams cp = base.CreateParams; 
     cp.Style |= WS_POPUP | WS_BORDER; 
     cp.ExStyle |= WS_EX_TOPMOST | WS_EX_NOACTIVATE; 
     return cp; 
    } 
    } 

    protected override bool ShowWithoutActivation 
    { 
    get { return true; } 
    } 

    protected override void WndProc(ref Message m) 
    { 
    if (m.Msg == WM_MOUSEACTIVATE) 
    { 
     OnClick(EventArgs.Empty); 
     m.Result = (IntPtr)MA_NOACTIVATEANDEAT; 
    } 
    else 
     base.WndProc(ref m); 
    } 

    public new void Show() 
    { 
    Windows.SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, 
     SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE); 
    base.Show(); 
    } 
} 
相關問題