| |

VB.NET - FortgeschritteneContextMenuStrip: Mit MouseEnter und MouseLeave Menü öffnen wie bei einem MenuSt | |  | Autor: Bieberpelz | Datum: 06.07.11 16:27 |
| Guten Tag,
ich habe Probleme bei der ordentlichen Verwendung von ContextMenuStrips, welche über die MouseEnter Funktion geöffnet werden sollen.
Da ich über UserControls/Benutzersteuerelemente das ContextMenuStrip jeweils aufrufe, möchte ich es realisiert bekommen das diese wie ein komplett normalens MenuStrip funktionieren.
Wenn ich nun mit der Maus über das Control 1 komme (MouseEnter) wird das Strip Menu tmFile geöffnet.
Private Sub Control1_MouseEnter(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Control1.MouseEnter
Dim pt = Control1.PointToScreen(Point.Empty) 'Nullpunkt der Textbox
pt.Y += Control1.Height - 5
tmFile.Show(pt)
End Sub Es sieht nun so aus wie auf dem Screenshot.
Durch das Bewegen zum Control2 soll nun tmFile geschlossen werden und statt dessen das ContextMenuStrip tmBasics (2) geöffnet werden.
Dies ordentlich zu lösen bildet mein Problem.
Lösungs-Ansatz 1: (fehlgeschlagen)
Ich hatte überlegt beim Verlassen von Control1 (MouseLeave) das ContextMenuStrip "tmFile" zu schließen.
Würde ich dies so machen hätte ich keine Möglichkeit einen Menüpunkt auszuwählen da dieses geschlossen werden würde sobald ich drüber navigiere(da es ja Control1 verlassen hat).
Um dies zu umgehen habe ich versucht die Maus-Koordinaten zu überprüfen um zu erkennen ob ich mich - sofern MouseLeave auf einem der beiden Controls einsetzt - mit der Maus auf einem der Steuerelemente Control1 oder tmFile befinde.
Im Falle das sich die Maus über keines der beiden Controls sich befindet soll das Menü geschlossen werden.
Leider funktioniert dies nicht da ich oft zurückgegeben bekomme das sich die Maus über dem Menü befindet obwohl dies nicht der Fall ist.
Siehe Quellcode, vermutlich ist dort ein Fehler.
(wird bei MouseLeave der Controls Control1 und fmFile aufgerufen)
Dim p As Point
Dim rc As Rectangle = tmFile.ClientRectangle
Dim re As Rectangle =Control1.ClientRectangle
p = PointToClient(Cursor.Position)
If re.Contains(p) = False And rc.Contains(p) = False Then
tmFile.Close()
End If Lösungs-Ansatz 2: (fehlgeschlagen)
Ich hatte mir überlegt jedes mal alle ContextMenuStrips(oder das vorherig aktive) zu schließen, sobald ich mit der Maus auf ein neues Control (1 - 5) komme.
Private Sub Control1_MouseEnter(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Control1.MouseEnter
ContextMenuStripsSchliessen(tmFile) 'Alle ContextMenuStrips schließen außer dem
' übergebenem, in diesem Falle tmFile
Dim pt = Control1.PointToScreen(Point.Empty) 'Nullpunkt der Textbox
pt.Y += Control1.Height - 5
tmFile.Show(pt)
End Sub Wenn ich nun den Focus vom Programm weg nehme, beispielsweise auf diesen Browser klicken, dann aber mit der Maus über mein Programm laufe(ohne zu klicken) funktioniert diese Version wunderbar. Wenn ich aber das Programm angeklickt habe, was ja in der Regel eh der Fall ist da ich im Programm arbeite, funktioniert dies nicht. Das Event "MouseEnter" wird, sobald ein ContextMenuStrip durch MouseEnter aufgerufen worden ist, nicht mehr ausgeführt. Als wäre die Maus praktisch niemals über eines der anderen Controls gewandert.
Und hier bin ich mit meinen Lösungsansätzen am Ende und weiß nicht wie ich ein solches Menü realisieren muss.
Ich wäre daher über jegliche Lösungsansätze, Fehler-Aufzeigungen, Links und dergleichen sehr dankbar.
Vielen Dank |  |
 ContextMenuStrip: Mit MouseEnter und MouseLeave Menü öffnen ... | 1.163 | Bieberpelz | 06.07.11 16:27 |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) sevWizard für VB5/6 
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|