vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
ToolStripMenuItems custom tooltip 
Autor: Novatlan
Datum: 31.08.22 16:24

Hi!

Ich habe auf meinem Form einen Toolstrip, der mehrere ToolStripDrowDownButtons enthält. Diese haben ToolStripMenuItems.
Für den ToolStrip habe ich mir eine abgeleitete Klasse gebaut, die ein eigenes ToolTip control enthält, das per OwnerDraw=True gestaltet wird. Wenn man über irgendein Control innerhalb des ToolStrips hovert, wird das ToolTip auch schön angezeigt.

Das funktioniert aber nicht mit den ToolStripMenuItems. Die benutzen die Standard ToolTip-Optik. Wenn ich über eines dieser ToolStripMenuItems hovere, wird im ToolStrip auch kein Hover-Event ausgelöst. Vermutlich weil die ToolStripMenuItems naütrlich außerhalb des ToolStrips in einem Dropdown-Menü erscheinen.

Ich suche jetzt verzweifelt, wie ich den ToolStripMenuItems auch meine hübschen custom ToolTips angedeihen lassen kann
Ich habe viele Stunden gesucht (ja, wirklich), und außer 1 Person auf Stackoverflow (ohne Antwort) nichts gefunden...

beste Grüße!

Novatlan
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ToolStripMenuItems custom tooltip 
Autor: Manfred X
Datum: 31.08.22 23:41

Hallo!

Mit dem Problem habe ich mich noch nicht befasst.
Die Toolstripmenuitem-Klasse (Windows.Forms) besitzt keine "OwnerDraw"-Eigenschaft.

Eine Möglichkeit könnte sein, beim Öffnen des Items dessen Bound-Eigenschaft abzufragen
(Position und Größe) und diesen Bereich durch ein geeignet gestaltetes Label oder eine
Bitmap zu überlagern. Damit könnte man auch Hover-Ereignisse erhalten.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: ToolStripMenuItems custom tooltip 
Autor: Novatlan
Datum: 03.09.22 15:48

Hi!

Danke! Das hat mich auf die richtige Idee gebracht... falls jemand anderes das gleiche Problemchen hat, Code untenstehend für ein custom control, basierend auf dem normalen ToolStripMenuItem, das einen neuen Tooltip-Parameter hat, sowie einen CustomToolTipText Parameter für den anzuzeigenden Text. Das Tooltip und der Text können im Designer zugewiesen werden, das neue Control dann einfach statt des Standard-ToolStripMenuItem verwenden.

Public Class cls_toolStripMenuItem
    Inherits ToolStripMenuItem
 
    Private _mouseOverPoint As Point
    Private ReadOnly _timer As Timer
    Public WithEvents Tooltip As ToolTip
    Public ToolTipInterval As Integer = 4000
    Public CustomToolTipText As String = ""
 
    Protected Overrides Sub OnMouseMove(ByVal mea As MouseEventArgs)
        MyBase.OnMouseMove(mea)
 
        If Math.Abs(_mouseOverPoint.X - mea.X) > _
          SystemInformation.MouseHoverSize.Width OrElse Math.Abs( _
          _mouseOverPoint.Y - mea.Y) > _
          SystemInformation.MouseHoverSize.Height Then
            _mouseOverPoint = mea.Location
            If Tooltip IsNot Nothing Then Tooltip.Hide(Me.Parent)
            _timer.Stop()
                _timer.Start()
            End If
    End Sub
 
    Protected Overrides Sub OnClick(ByVal e As EventArgs)
        MyBase.OnClick(e)
        If Tooltip IsNot Nothing Then Tooltip.Hide(Me.Parent)
    End Sub
 
    Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
        MyBase.OnMouseUp(e)
    End Sub
 
    Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
        MyBase.OnMouseLeave(e)
        _timer.Stop()
        If Tooltip IsNot Nothing Then Tooltip.Hide(Me.Parent)
        _mouseOverPoint = New Point(-50, -50)
    End Sub
 
    Private Sub timer_Tick(ByVal sender As Object, ByVal e As EventArgs)
        _timer.Stop()
        Try
            If Not Equals(CustomToolTipText, Nothing) AndAlso _
              CustomToolTipText.Length > 0 Then
                Dim tipPoint As Point = New Point(Me.Bounds.Location.X + 50, _
                Me.Bounds.Location.Y + 50)
                tooltip.Show(CustomToolTipText, Me.Parent, tipPoint, _
                ToolTipInterval)
            End If
        Catch
            'Just catching if there's no mouseoverpoint.
        End Try
    End Sub
 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        MyBase.Dispose(disposing)
 
        If disposing Then
            _timer.Dispose()
            tooltip.Dispose()
        End If
    End Sub
 
    Public Sub New()
        MyBase.New()
        _timer = New Timer With {
            .Enabled = False,
            .Interval = SystemInformation.MouseHoverTime
        }
        AddHandler _timer.Tick, New EventHandler(AddressOf timer_Tick)
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 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