2010-09-29 62 views
0

我有一個窗體,我需要按鈕在窗體的底部邊緣,與邊框沒有間隙。這些按鈕應該是「自動隱藏」的,所以它們只在鼠標處於例如窗體的下20個像素時顯示。所以我使用MouseMove事件來觸發此事件,如下面的代碼。但是,如果鼠標離開底部邊緣的按鈕所在的位置,那麼這些按鈕顯然會保持不變。但我希望他們隱藏。所以我需要爲此目的通過其他事件來隱藏按鈕。因此,我嘗試在窗體的MouseLeave事件中隱藏它們。但是這會使按鈕不可點擊,並且處於不穩定的狀態,當鼠標移過按鈕時會閃爍。這是爲什麼?我怎樣才能避免這個問題得到這樣的自動隱藏功能?鼠標從底部離開時不隱藏按鈕

Private Sub ZgScale_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove 

    If e.Y > Me.ClientSize.Height - 30 Then 
     Button1.Visible = True 
    Else 
     Button1.Visible = False 
    End If 
End Sub 

Private Sub ZgScale_MouseLeave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave 
    Button1.Visible = False 
End Sub 

回答

2

MouseLeave事件觸發時鼠標不再直接對照(或形式)上。
如果鼠標移動到子控件上,該事件將觸發。

您需要檢查鼠標是否不再在窗體上,像這樣:

If Not Me.ClientRectangle.Contains(Me.PointToClient(e.Location)) Then 
    Button1.Visible = False 
End If 

編輯:固定

+0

嗯..但在哪裏把這個代碼? – bretddog 2010-09-29 21:00:25

+0

@bretddog:現在就試試。我錯誤地檢查窗框。 – SLaks 2010-09-29 21:02:07

+0

謝謝..我認爲問題是鼠標離開窗體時MouseMove事件不會觸發..所以我可以在哪裏放置代碼? – bretddog 2010-09-29 21:05:23

1

Windows有內置的爲這種情況的直接支持。也暴露在Windows窗體和WPF中。一旦得到MouseMove事件,將控件上的Capture屬性設置爲True。即使鼠標移動到控制窗口之外,也會強制所有鼠標消息指向控件。

一旦看到它移動到控件邊界之外,將Capture設置爲false並隱藏控件。請注意,當用戶單擊鼠標時會關閉捕捉,因此您可能不得不在以後重新打開捕捉。雖然它應該是自動的,但你會得到另一個MouseMove事件。如果用戶移動鼠標確實快速可能會失敗。

+0

有趣的..如果我理解正確,我應該讓窗體或底層控件捕獲鼠標,而不是按鈕(?)我看到..但是,然後如果我滾動鼠標在按鈕上,將按鈕獲取該鼠標事件? – bretddog 2010-09-29 21:47:47

+0

哦..這不是一個按鈕事件..對不起。但是例如按鈕的mouseLeave事件。我不會用這個解決方案嗎?因爲我需要在這樣的事件上做點什麼。就像改變按鈕的顏色一樣。 – bretddog 2010-09-29 21:51:03

+0

當你想讓多個控件消失時,它會變得模糊。協調他們的MouseEnter/Leave事件不起作用,它總是被用戶移動鼠標的速度所擊敗。鼠標被採樣,它不提供連續的像素位置流。唯一真正的解決方法是使用一個定時器,200毫秒是好的,然後看看Mouse.Position。你需要Control.PointToClient。 – 2010-09-29 22:07:10