Menü beim Hovern anzeigen

Hoazl

Grünschnabel
Hallo,
ich möchte mir eine UserForm machen, die grundsätzlich nur ein Bild anzeigt, und wenn man mit der Maus darüber fährt soll am unteren Rand ein kleines Menü mit Buttons angezeigt werden, die einfache Bildbearbeitung ermöglichen. Hab da jetzt so realisiert, dass ich die Buttons einfach auf ein Panel setze, dass standardmäßig Visible=false ist und bei der PictureBox zwei Events hinzugefügt, eins MouseEnter und eins MouseLeave, die mir die Visible-Eigenschaft des Panels togglen.

Beim austesten legt das Ganze allerdings ein komisches Verhalten an den Tag; Der Button ist nicht klickbar und wird hin und wieder gar nicht angezeigt (das Panel ist an dieser Stelle durchsichtig). Ich könnt' mir vorstellen, dass das daran liegt, dass die beiden Events ganz schnell in einer Schleife hintereinander gefired werden (Maus am Panel -> MouseLeave der PictureBox -> Panel unsichtbar -> MouseEnter der Picturebox -> Panel sichtbar -> MouseLeave usw.).

Jetzt meine Frage: Wie kann ich das am Besten realisieren?

So far,
David
 
Hey! Keine Ahnung, ob ichs richtig verstanden habe, aber so hats bei mir funktioniert:

Private Sub Panel1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel1.MouseEnter
cmdTestbutton.Visible = True
End Sub

Private Sub frmMain_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
cmdTestbutton.Visible = False
End Sub

Sobald du mit der Maus über den Button oder Panel kommst, wird der Button angezeigt, ansonsten wird der Button ausgeblendet :)
 
Hi,
danke für deine Idee, das hat funktioniert.
Für zukünftige Besucher: Da ich das Ganze in einem eigenen UserControl machen wollte, hab' ich einfach dem UserControl einen unsichtbaren Rand von 10px auf jeder Seite gegeben und folgende Events hinzugefügt:

C#:
        private void pictureBox1_MouseEnter(object sender, EventArgs e)
        {
            panel1.Visible = true;
        }

        private void ImageDisplay_MouseLeave(object sender, EventArgs e)
        {
            panel1.Visible = false;
        }

Danke nochmal!
David
 
Es geht auch ohne Pixel-Rand:
Einfach beim MouseLeave-Event des UserControls prüfen, ob die Mauskoordinaten doch noch innerhalb des Controls sind:
Code:
Public Class UserControl1

    Private Sub UserControl1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        Me.Panel1.Visible = True
    End Sub

    Private Sub UserControl1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        ' Mauskoordinaten in Koordinatensystem des UserControls umrechnen:
        Dim MausPos As Point = Me.PointToClient(System.Windows.Forms.Control.MousePosition)
        ' Prüfen, ob Mauskoordinaten innerhalb des UserControls liegen und "Panel1" entsprechend (un-)sichtbar machen:
        Me.Panel1.Visible = MausPos.X >= 0 And MausPos.X <= Me.Width And MausPos.Y >= 0 And MausPos.Y <= Me.Height
    End Sub

End Class
 
Ich habe leider auch noch keine bessere Lösung gefunden (hatte/habe ein ähnliches Problem in c#), aber bei der Lösung oben ist das Problem, dass MouseLeave ggf. nie für das richtige, untere Control aufgerufen wird, wenn man direkt von einem auf dem UserControl liegenden Control raus geht. Dann wird MouseLeave nur einmal aufgerufen wenn man vom UserControl selbst ins darin liegende Control wandert, und wenn man von da aus komplett rausgeht (ohne Pixel-Rand), dann gibt es kein MouseLeave vom UserControl mehr.
Der Pixel-Rand funktioniert aber leider auch nur, wenn man nicht sehr schnell die Maus bewegt. Ist man zu schnell, kann es sein dass beim Szenario oben das MouseLeave auch nicht aufgerufen wird.
Leider scheint es zu dem Problem keine triviale Lösung zu finden...denkbar wäre die MouseEnter/MouseLeave Events von allen eingebetteten Controls abzufangen...

gruß
Ringelsocke
 
Du hast Recht, ich hatte das nicht ordentlich getestet.
Man könnte einen Maus-Hook setzen, dann wird man immer informiert, sobald sich die Mausposition irgendwie ändert (gilt nur für Mauspositionen innerhalb der Anwendung).
Folgende Links könnten hilfreich sein:
http://support.microsoft.com/default.aspx?scid=kb;en-us;318804
http://www.codeproject.com/KB/cs/globalhook.aspx

Oder ganz simpel einen Timer nehmen, der jede Sekunde überprüft, ob die Mauskoordinaten noch im UserControl liegen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück