| |

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.161 | 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 |
  |
|
sevISDN 1.0 
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0 
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... 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
|
|