vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Forms/Controls   |   VB-Versionen: VB5, VB615.12.02
Klasse: ToolTip Deluxe

Finden Sie die Standard ToolTips nicht auch irgendwie langweilig? Haben Sie sich nicht auch schon mal geärgert, dass diese noch nicht einmal mehrzeilig dargestellt werden können? Würden Sie gerne eine Sprechblase mit zusätzlichem Icon als ToolTip anzeigen? Wenn ja, dann ist dieser Workshop genau richtig für Sie! :-)

Autor:  Michael HartmannBewertung:     [ Jetzt bewerten ]Views:  28.086 

Finden Sie die Standard ToolTips nicht auch irgendwie langweilig? Haben Sie sich nicht auch schon mal geärgert, dass diese noch nicht einmal mehrzeilig dargestellt werden können? Würden Sie gerne eine Sprechblase mit zusätzlichem Icon als ToolTip anzeigen? Wenn ja, dann ist dieser Workshop genau richtig für Sie!

Voraussetzungen für die erweiterten ToolTips

Wem die begrenzten Möglichkeiten der Standardtooltips nicht ausreichen, kann seine Tooltips mit ein paar API-Funktionen mächtig ausweiten. Folgende Attribute können den Tooltips verpasst werden:

  • Mehrzeiliger Text mit manuellem oder automatischem Textumbruch
  • Angabe einer maximalen Breite für die Tooltipfenster
  • Anzeige eines Icons in der linken oberen Ecke
  • Anzeige einer Titelzeile neben dem Icon
  • Einstellung der Text- und Rahmenfarbe des Tooltipfensters
  • Einstellung der Hintergrundfarbe des Tooltipfensters
  • Beliebige Schriftart für den Tooltiptext
  • Einstellung der Zeit, bis der Tooltip erscheint und auch wieder verschwindet
  • Anzeige des Tooltipfensters als Sprechblase entweder zentriert am Control oder abhängig von der Mausposition

Aber erst noch einmal etwas sehr wichtiges vorweg:
Unsere Klasse "ToolTip Deluxe" funktioniert nur, wenn auf dem System die COMCTL32.DLL in der Version 5.80 oder höher installiert ist. Diese Version wird z.B. vom Internet Explorer ab Version 5.0 auf dem System installiert, d.h. alle Betriebssysteme, welche den Internet Explorer ab dieser Version mitbringen, erfüllen schon mal die Voraussetzungen, dass die DLL in der richtigen Version vorhanden ist.

Und jetzt zur eigentlichen Implemenatation der Tooltiperweiterungen. Der kompletten Code wurde in ein Klassenmodul verpackt, so dass daraus sowohl eine externe DLL gemacht werden kann, als auch in ein bestehendes Programm integriert werden kann.

Starten Sie die VB-Entwicklungsumgebung und fügen Sie dem Projekt gleich einmal ein neues Klassenmodul hinzu. Im Eigenschaftenfenster der Klasse (Rechtsklick auf Class1 im Projekt-Explorer) legen Sie als Namen clsToolTipDeluxe fest.

Die benötigten API-Deklarationen

Wie bereits eingangs erwähnt benötigen wir für die "ToolTip-Deluxe" Variante ein paar API-Funktionen, sowie bestimmte Konstanten und Typen. Die gesamten Deklarationen setzen wir in den Allgemein-Teil des Klassen-Moduls:

Option Explicit
 
' Konstanten zum Erzeugen des Tooltip-Fensters
Private Const WS_POPUP = &H80000000
Private Const TTS_ALWAYSTIP = &H1
Private Const TTS_NOPREFIX = &H2
Private Const TTS_BALLOON = &H40
Private Const CW_USEDEFAULT = &H80000000
 
' Konstanten zum Ändern/Erstellen der Tooltips
Private Const WM_USER = &H400
Private Const TTM_SETDELAYTIME = WM_USER + 3
Private Const TTM_ADDTOOL = WM_USER + 4
Private Const TTM_SETTIPBKCOLOR = WM_USER + 19
Private Const TTM_SETTIPTEXTCOLOR = WM_USER + 20
Private Const TTM_SETMAXTIPWIDTH = WM_USER + 24
Private Const TTM_SETTITLE = WM_USER + 32
 
' Konstanten zum Setzen der Zeiten, nachdem der Tooltip
' erscheint bzw. wieder verschwindet
Private Const TTDT_AUTOPOP = 2
Private Const TTDT_INITIAL = 3
 
' Konstanten, welche über das Aussehen und das Verhalten
' des Tooltipfensters bestimmen
Private Const TTF_IDISHWND = &H1
Private Const TTF_CENTERTIP = &H2
Private Const TTF_SUBCLASS = &H10
 
' Konstanten zum Setzen der Schriftart des Tooltips
Private Const WM_SETFONT = &H30
Private Const LOGPIXELSY = 90
 
' Verschiedene Typdeklarationen für die API-Funktionen
Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
 
Private Type TOOLINFO
  cbSize As Long
  uFlags As Long
  hWnd As Long
  uId As Long
  cRect As RECT
  hinst As Long
  lpszText As String
End Type

Gleich dahinter die benötigten API-Funktionen:

' API-Funktionsdeklarationen
Private Declare Function CreateWindowEx Lib "user32.dll" _
  Alias "CreateWindowExA" ( _
  ByVal lExStyle As Long, _
  ByVal strClassName As String, _
  ByVal strWindowName As String, _
  ByVal lStyle As Long, _
  ByVal X As Long, _
  ByVal Y As Long, _
  ByVal lWidth As Long, _
  ByVal lHeight As Long, _
  ByVal hWndParent As Long, _
  ByVal hMenu As Long, _
  ByVal hInstance As Long, _
  lParam As Any) As Long
 
Private Declare Function DestroyWindow Lib "user32.dll" ( _
  ByVal hWnd As Long) As Long
 
Private Declare Function GetClientRect Lib "user32.dll" ( _
  ByVal hWnd As Long, _
  lpRect As RECT) As Long
 
Private Declare Function SendMessage Lib "user32.dll" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
Private Declare Function SendMessageLong Lib "user32.dll" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As Long) As Long
 
Private Declare Function SendMessageStr Lib "user32.dll" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As String) As Long
 
Private Declare Function GetDC Lib "user32.dll" ( _
  ByVal hWnd As Long) As Long
 
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
 
 
Private Declare Function CreateFont Lib "gdi32.dll" _
  Alias "CreateFontA" ( _
  ByVal lHeight As Long, _
  ByVal lWidth As Long, _
  ByVal lEscapement As Long, _
  ByVal lOrientation As Long, _
  ByVal lBold As Long, _
  ByVal lItalic As Long, _
  ByVal lUnderline As Long, _
  ByVal lStrikethrough As Long, _
  ByVal lCharset As Long, _
  ByVal lOutputPrecision As Long, _
  ByVal lClipPrecision As Long, _
  ByVal lQuality As Long, _
  ByVal lPitchAndFamily As Long, _
  ByVal strFontName As String) As Long
 
Private Declare Function GetDeviceCaps Lib "gdi32.dll" ( _
  ByVal hDC As Long, _
  ByVal nIndex As Long) As Long
 
Private Declare Function MulDiv Lib "kernel32.dll" ( _
  ByVal lNumber As Long, _
  ByVal lNumerator As Long, _
  ByVal lDenominator As Long) As Long

Die Klasse braucht noch zwei Membervariablen. In der Variable m_hWnd wird der Window-Handle des erzeugten Tooltip-Fensters gespeichert, die Variable m_lMaxWidth speichert die maximale Breite des Tooltip-Fensters in Pixel.

' Membervariablen der Klasse
' Window-Handle des erzeugten Tooltip-Fensters
Private m_hWnd As Long
 
' Max. erlaubte Breite des Tooltip-Fensters
Private m_lMaxWidth As Long

Zum Schluß wird noch eine öffentliche Aufzählung (ENUMueration) deklariert, das für die Einstellung des Icons im Tooltip verantwortlich ist. Als Icons kommen leider keine benutzerdefinierten Icons in Frage, sondern nur die drei Systemicons "Information", "Warnung" und "Fehler" oder eben gar kein Icon. Wird versucht der Funktion einen anderen Wert mitzugeben, so wird einfach autom. gar kein Icon angezeigt.

' Aufzählung für das Icon im ToolTip
Public Enum enumIcon
  NoIcon = 0
  InfoIcon = 1
  WarningIcon = 2
  ErrorIcon = 3
End Enum

Initialisierung und Steuern des Aussehens der ToolTips

Wird die Klasse später von der Mainanwendung erstellt, so wird das Class_Initialize Ereignis ausgelöst. In dieser Initialisierungsphase rufen wir die benötigte InitCommonControls-Funktion aus der COMCTL32.DLL auf und setzen auch gleich einmal eine Standard Maximalbreite für unser neues Tooltip-Fenster.

' Initialisierung
Private Sub Class_Initialize()
  InitCommonControls
  m_lMaxWidth = 300
End Sub

Wird die Klasse von der Mainanwendung beendet, zerstören wir das erstellte ToolTipfenster, um den belegten Speicher im System wieder freizugeben:

' Beenden
Private Sub Class_Terminate()
  If m_hWnd <> 0 Then DestroyWindow m_hWnd
End Sub

Nun geht es an die Eigenschaften unserer Klasse, die dann später öffentlich zugänglich sind, um so das Aussehen der neuen Tooltips zu steuern.

Maximale Breite des Tooltipfensters
Die Standard-Breite (maximale Breite) haben wir ja bereits im Class_Initialize Ereignis festgelegt. Evtl. ist es aber nötig, dass man die Breite des Tooltipfensters später gezielt per Code anpassen will. Also fügen wir der Klasse folgenden Code hinzu:

' Setzen der maximalen Breite des Tooltipfensters in Pixel
Public Property Let MaxWidth(ByVal lMaxWidth As Long)
  m_lMaxWidth = lMaxWidth
  SendMessageLong m_hWnd, TTM_SETMAXTIPWIDTH, 0, _
    m_lMaxWidth
End Property

Festlegen der Zeit, wie lange der ToolTip maximal angezeigt werden soll
Die Angabe der Zeit erfolgt in Millisekunden. Obwohl ein Long übergeben und auch mit der SendMessage-Funktion ein Long-Wert an dasTooltipfenster gesendet wird, ist hier ein max. Wert von 32767 (als Integer-Wert) möglich.

' Setzen der Zeit in Millisekunden, wie lange der
' Tooltip angezeigt werden soll.
Public Property Let VisibleTime(ByVal lTime As Long)
  If lTime > 32767 Then lTime = 32767
  If lTime < 0 Then lTime = 0
 
  SendMessageLong m_hWnd, TTM_SETDELAYTIME, _
    TTDT_AUTOPOP, lTime
End Property

Festlegen der Zeit, ab der der ToolTip angezeigt werden soll
Die Angabe erfolgt wiederum in Millisekunden. Auch hier ist es nur möglich Werte im Integer-Bereich zu verwenden, obwohl die Funktion einen Long-Wert an das Tooltipfenster schickt. Aber wer will auch schon 32 Sekunden warten bis ein Tooltip erscheint

' Setzen der Zeit in Millisekunden, die vergeht, bis
' der Tooltip angezeigt werden soll. 
Public Property Let DelayTime(ByVal lTime As Long)
  If lTime > 32767 Then lTime = 32767
  If lTime < 0 Then lTime = 0
 
  SendMessageLong m_hWnd, TTM_SETDELAYTIME, _
    TTDT_INITIAL, lTime
End Property

Text- und Rahmenfarbe für das Tooltipfenster
Leider gibt es (noch) keine getrennten Einstellmöglichkeiten für Text- und Rahmenfarbe. Wichtig ist auch, dass der übergebene Farbwert ein RGB-Wert ist, der z.B. mit der VB-Funktion RGB erstellt wurde oder eine der vordefinierten Farbwerte (z.B. vbBlue). Wenn man nämlich eine Systemfarbe (z.B. &H80000005 für die Fensterhintergrundfarbe) angibt, wird diese Farbe einfach als Schwarz behandelt.

' Setzen der Text- und Rahmenfarbe für das Tooltip-
' Fenster.
Public Property Let ToolTipTextColor(ByVal lColor As Long)
  SendMessageLong m_hWnd, TTM_SETTIPTEXTCOLOR, lColor, 0
End Property

Hintergrundfarbe für das Tooltipfenster
Hier gilt eigentlich das gleiche wie für die Text- bzw. Rahmenfarbe. Es muss ein RGB-Farbwert an die Funktion übergeben werden, sonst wird die Farbeinstellung ignoriert und stattdessen die Farbe schwarz verwendet. Und das sieht dann total Klasse aus, wenn man schwarze Schrift auf schwarzem Hintergrund darstellt

' Hintergrundfarbe für das Tooltipfenster
Public Property Let ToolTipBackColor(ByVal lColor As Long)
  SendMessageLong m_hWnd, TTM_SETTIPBKCOLOR, lColor, 0
End Property

Festlegen der gewünschten Schriftart
Bis jetzt waren die Eigenschaften der Klasse ja alle sehr überschaulich und dürften auch niemanden vor all zu große Probleme gestellt haben. Jetzt wird es aber ein kleines wenig komplizierter, den es geht an die Schrifteinstellung für das Tooltip-Fenster.

' Schriftart für den Text im ToolTip festlegen
' Erwartet wir ein Standard Font-Objekt
Public Property Set Font(ByVal objFont As StdFont)
  Dim hFont As Long
  Dim lHeight As Long
  Dim lItalic As Long
  Dim lBold As Long
  Dim lUnderline As Long
  Dim lStrikethrough As Long
  Dim lDefaultLocaleID As Long
  Dim lRet As Long
  Dim strCodePage As String * 6
  Dim lCodePage As Long
 
  If objFont Is Nothing Then Exit Property
 
  ' Um dem Tooltip-Fenster eine andere Schriftart
  ' unterzujubeln, gibt es leider keine Eigenschaften,
  ' die es ermöglicht, einfach so einen Schriftnamen
  ' oder eine Schriftgröße an das Window-Handle zu
  ' senden. Wir müssen dazu mit der API-Funktion
  ' CreateFont einen Font-Handle erzeugen und diesen
  ' mit Hilfe der Nachricht WM_SETFONT an das Tooltip-
  ' Fenster senden.
 
  ' Um mit der API-Funktion CreateFont einen korrekten
  ' Handle für einen Font zu erzeugen, muss die Größe
  ' des Fonts in Pixel auf dem Ausgabemedium
  ' umgerechnet werden. Dazu wird die untenstehende
  ' Formel verwendet, welche in der MSDN mehrfach zu
  ' finden ist.
 
  lHeight = -MulDiv(objFont.Size, _
    GetDeviceCaps(GetDC(m_hWnd), LOGPIXELSY), 72)
 
  ' Für die Funktion CreateFont müssen die
  ' Schriftattribute "Fett", "Kursiv", "Unterstrichen"
  ' und "Durchgestrichen" noch umdefiniert werden.
  ' Dabei kommt dem Attribut "Fett" eine besondere
  ' Bedeutung zu, da man hier sehr viele verschiedene
  ' Werte zwischen 100 und 900 angeben kann. Dabei
  ' entspricht ein Wert von 400 ungefähr dem
  ' Normaldruck und ein Wert von 700 entspricht etwa
  ' dem Fettdruck.
 
  lItalic = IIf(objFont.Italic, 1&, 0&)
  lBold = IIf(objFont.Bold, 700&, 400&)
  lUnderline = IIf(objFont.Underline, 1&, 0&)
  lStrikethrough = IIf(objFont.Strikethrough, 1&, 0&)
 
  ' Nun kann endlich die erforderliche Schrift mit der
  ' Funktion CreateFont erzeugt werden und mit
  ' SendMessageLong an das Tooltip-Fenster geschickt
  ' werden.
 
  hFont = CreateFont(lHeight, 0&, 0&, 0&, lBold, _
    lItalic, lUnderline, lStrikethrough, _
    0&, 0&, 0&, 0&, 0&, objFont.Name)
 
  lRet = SendMessageLong(m_hWnd, WM_SETFONT, hFont, 1&)
End Property

Erstellen des ToolTip-Fensters

Jetzt wurde schon eine ganze Zeit lang über das Window-Handle des Tooltip-Fensters geredet, aber noch nicht erklärt, wo das Ding den überhaupt herkommt. Dazu wird der Klasse eine Create-Methode verpasst, die genau dieses Tooltip-Windowhandle erzeugt und in der Variable m_hWnd speichert. Außerdem wird die maximale Breite des Tooltip-Fensters schon mal definiert, falls die ensprechende Eigenschaft nicht gesetzt werden sollte.

Die API-Funktion CreateWindowEx erzeugt das benötigte Window-Handle. Wichtig sind dabei vor allem der zweite Parameter "tooltips_class32", damit es auch ein Tooltip-Fenster wird und nicht ein "normales" Fenster, sowie der vierte Parameter, der über dasAussehen des Fensters bestimmt. Dabei bewirkt die Konstante TTS_NOPREFIX, das auch das &-Zeichen als solches dargestellt wird. Wird diese Konstante weggelassen, so werden alle &-Zeichen aus dem Text des Tooltip-Fensters herausgefiltert. Die Konstante TTS_ALWAYSTIP bewirkt, das immer ein Tooltip erscheint, auch wenn das dazugehörige Control deaktiviert ist. Zuletzt gibt es noch die KonstanteTTS_BALLOON, welche das Tooltip-Fenster wie eine Sprechblase aussehen lässt. Möchte man keine Sprechblasen, so läßt man hier einfach diese Konstante weg.

' Erzeugt das Tooltipfenster
Public Sub Create(ByVal hWndParent As Long, _
  Optional ByVal bAlwaysTip As Boolean = True, _
  Optional ByVal bBalloonTip As Boolean = True)
 
  Dim nFlags As Long
 
  ' Wir möchten kein normales Fenster :-)
  nFlags = WS_POPUP Or TTS_NOPREFIX
 
  ' Falls der ToolTip auch bei deaktiviertem 
  ' Control erscheinen soll...
  If bAlwaysTip Then nFlags = nFlags Or TTS_ALWAYSTIP
 
  ' Falls ein "moderner" Balloon-ToolTip erwünscht...
  If bBalloonTip Then nFlags = nFlags Or TTS_BALLOON
 
  ' Window-Handle erstellen  
  m_hWnd = CreateWindowEx(0, "tooltips_class32", 0, _
    nFlags, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, _
    CW_USEDEFAULT, hWndParent, 0, App.hInstance, 0)
 
  ' maximale Fensterbreite festlegen
  SendMessageLong m_hWnd, TTM_SETMAXTIPWIDTH, 0, m_lMaxWidth
End Sub

So, nun haben wir das Window-Handle für das Tooltip-Fenster, aber was erzeugt wird, muss natürlich auch wieder zerstört werden, wenn es nicht mehr gebraucht wird. Dazu bekommt die Klasse eine Funktion Destroy, welche das gerade erzeugt Window-Handle wieder zerstört.

' ToolTip zerstören
Public Sub Destroy()
  DestroyWindow m_hWnd
End Sub

Hinzufügen von Controls

Wir brauchen aber noch eine weitere Funktion in der Klasse, über die wir alle Controls, welche nachher über einen Tooltip beschrieben werden sollen, dem Tooltip-Fenster hinzufügen. Dazu muss dem Tooltipfenster der Tooltiptext, das Window-Handle und das Rechteck, an dem sich das Control befindet, bekannt gemacht werden. Dies geschieht mit Hilfe der TOOLINFO-Struktur und der Nachricht TTM_ADDTOOL, welche die notwendigen Informationen an das Tooltip-Fenster sendet. Wichtig ist vor allem der Inhalt der Variable uFlags. Sie wird auf jeden Fall mit den Konstanten TTF_IDISHWND und TTF_SUBCLASS gefüllt. Optional kann mit der Konstanten TTF_CENTERTIP das Tooltip-Fenster zentriert an dem zugehörigen Control ausgerichtet werden. Die Konstante TTF_IDISHWND teilt dem Tooltip-Fenster mit, dass der in der Variable uId übergebene Wert ein Window-Handle ist. Die Konstante TTF_SUBCLASS bewirkt, dass Events an das Tooltip-Fenster an das dazugehörige Control weitergeleitet werden.

Public Sub AddControl(ByVal objControl As Object, _
  ByVal strCaption As String, _
  Optional ByVal bCenterToolTip As Boolean = False)
 
  Dim udtToolInfo As TOOLINFO
 
  With udtToolInfo
    GetClientRect objControl.hWnd, .cRect
    .hWnd = objControl.hWnd
    .uFlags = TTF_IDISHWND Or TTF_SUBCLASS
    If bCenterToolTip Then
      .uFlags = .uFlags Or TTF_CENTERTIP
    End If
    .uId = objControl.hWnd
    .lpszText = strCaption
    .cbSize = Len(udtToolInfo)
  End With
 
  SendMessage m_hWnd, TTM_ADDTOOL, 0, udtToolInfo
End Sub

Erweiterte ToolTip-Eigenschaften

Jetzt ist die Tooltip-Fenster-Klasse fast fertig, aber war da nicht noch was mit Titelzeile und Icon? Stimmt, aber das Ganze lässt sich sehr einfach in einer Methode unterbringen. Leider kann man die Titelzeile mit Icon nur für das gesamte Tooltip-Fenster definieren und nicht schon über die AddControl-Funktion, die gerade beschrieben wurde. Möchte man also für verschiedene Controls unterschiedliche Titelzeilen haben, so muss man in den MouseMove-Ereignisfunktionen der jeweiligen Controls die folgende Methode aufrufen:

' ToolTip Icon und Titeltext festlegen
Public Sub SetToolTipTitle(ByVal strTitle As String, _
  ByVal iTitleIcon As enumIcon)
 
  SendMessageStr m_hWnd, TTM_SETTITLE, _
    iTitleIcon, strTitle
End Sub

Möchte man weder Icon noch Titelzeile anzeigen muss die Methode später im MouseMove-Ereignis des Controls wie folgt aufgerufen werden:

SetToolTipTitle vbNullString, NoIcon
Hiermit wären die Arbeiten an der Klasse abgeschlossen und es soll ein kleines Beispiel folgen.

Beispiel für den Einsatz der ToolTip-Klasse

Unsere neuen "ToolTips Deluxe" möchten wir natürlich auch gleich einmal testen. Hierzu ziehen wir drei TextBox-Objekte auf die Form1 unseres Projekts. Die erste TextBox soll gleich einmal mit einem schönen modernen Balloon-ToolTip inkl. Icon und Titelzeile ausgestattet werden - und natürlich mehrzeilig Die zweite TextBox bekommt ebenfalls einen mehrzeiligen Ballon-ToolTipText, jedoch mit blauen Hintergrund und weißer Schrift. Weiterhin möchten wir den ToolTip nicht am Cursor, sondern zentriert am Control ausrichten. Außerdem wünschen wir diesmal kein Icon, sondern nur eine Titelzeile. Und damit wir die neuen "ToolTips Deluxe" mit den bisherigen langweiligen Standard-ToolTips vergleichen können, bekommt die dritte TextBox den ToolTipText über die Standard-Eigenschaft der TextBox zugewiesen.

Im Allgemein-Teil der Form müssen wir zunächst eine Objektvariable deklarieren, die auf unsere neue ToolTip-Klasse verweist:

Option Explicit
 
' ToolTip-Objekt deklarieren
Private m_objTooltip As clsToolTipDeluxe

Wie bereits erwähnt darf man für die Farbeinstellungen der ToolTips nur RGB-Farbwerte verwenden. Um nun eine Systemfarbe in den korrekten RGB-Farbwert umzuwandeln, benötigen wir noch folgenden Code:

' API-Deklaration
Private Declare Function GetSysColor Lib "user32" _
  (ByVal nIndex As Long) As Long
' Umwandeln einer Systemfarbe nach RGB
Private Function SysColorToRGB(ByVal nColor AS OLE_COLOR) As Long
  If (nColor And &HFF000000) = &H80000000 Then _
    nColor = GetSysColor(nColor And &HFFFFFF)
 
  SysColorToRGB = nColor
End Function

Im Form_Load Ereignis erstellen wir das ToolTip-Objekt und fügen diesem unsere beiden TextBox-Controls hinzu.

Private Sub Form_Load()
  ' ToolTip-Klasse instanzieren
  Set m_objTooltip = New clsToolTipDeluxe
 
  With m_objTooltip
    ' ToolTip-Fenster erzeugen
    .Create Me.hWnd
 
    ' Maximale Breite des ToolTip-Window
    .MaxWidth = 400
 
    ' entspricht einer Dauer von 10 Sekunden
    .VisibleTime = 10000
 
    ' entspricht einer Dauer von 0,2 Sekunden
    .DelayTime = 200
 
    ' ToolTip-Text für die 1. TextBox
    .AddControl Text1, "Dieser Tooltip wird" & _
      vbCrLf & "manuell umgebrochen" & vbCrLf & _
      "und richtet sein" & vbCrLf & "Erscheinungsbild" & _
      vbCrLf & "nach dem Mauscursor."
 
    ' ToolTip-Text für die 2. TextBox
    .AddControl Text2, "Noch ein mehrzeiliger Tooltip. " & _
      "Dieser ist an dem dazugehörigen Control " & _
      "zentriert ausgerichtet. Außerdem wird der Text " & _
      "automatisch umgebrochen, damit die maximale " & _
      "Breite des Tooltipfensters nicht übeschritten " & _
      "wird.", True
  End With
 
  ' Gewöhnlicher ToolTip-Text für die 3. TextBox
  Text3.ToolTipText = "Wie langweilig! Ein normaler" & _
    vbCrLf & "Tooltip der nicht mal mehrzeilig ist ;-)"
End Sub

Wird die Form entladen, zerstoren wir sicherheitshalber das ToolTip-Fenster, indem wir die Destroy-Methode des Klassenmoduls aufrufen:

Private Sub Form_Unload(Cancel As Integer)
    m_objTooltip.Destroy
End Sub

Der ToolTip der ersten TextBox soll mit Icon und Titelzeile "ausgestattet" sein:

Private Sub Text1_MouseMove(Button As Integer, _
  Shift As Integer, X As Single, Y As Single)
 
  With m_objTooltip
    ' Standard ToolTip-Farbe
    .ToolTipBackColor = SysColorToRGB(&H80000018)
    .ToolTipTextColor = SysColorToRGB(&H80000017)
 
    ' InfoIcon und Titelzeile
    Call .SetToolTipTitle("Information", InfoIcon)
  End With
End Sub

Der ToolTip der zweiten TextBox soll ohne Icon, aber mit Titelzeile und in weißer Schrift auf blauem Hintergrund angezeigt werden.

Private Sub Text2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  With m_objTooltip
    ' Blauer Hintergrund und weiße Schrift
    .ToolTipBackColor = vbBlue
    .ToolTipTextColor = vbWhite
 
    ' Kein Icon, aber mit Titelzeile
    Call .SetToolTipTitle("Titelzeile", NoIcon)
  End With
End Sub

Das war's dann auch schon. Starten Sie das Projekt und lassen Sie sich überraschen

Erweiterte Möglichkeiten

Natürlich müssen Sie nicht die Standard-Schrift für die neuen ToolTips verwenden. Sie könnten die ToolTips z.B. auch so anzeigen lassen:

Dim oFont As New StdFont
 
' Schriftattribute festlegen
With oFont
  .Name = "Comic Sans MS"
  .Size = 14
  .Italic = True
End With
 
Set m_objToolTip.Font = oFont

Sie sehen: Die ToolTipDeluxe-Klasse bietet Ihnen wirklich sehr viele Freiheiten.
 

31.07.07: Erweiterung der ToolTip-Klasse

Marco Scheibe
Im nachfolgenden wird gezeigt, wie sich die ToolTip-Klasse dahingehend erweitern lässt, dass der ToolTip AlwaysOnTop angezeigt wird. Fügen Sie hierzu nachfolgende Deklarationen in den allgemeinen Deklarations-Teil der ToolTip-Klasse hinzu:

Private Declare Function SetWindowPos Lib "user32" ( _
  ByVal hWnd As Long, _
  ByVal hWndInsertAfter As Long, _
  ByVal x As Long, _
  ByVal y As Long, _
  ByVal cx As Long, _
  ByVal cy As Long, _
  ByVal wFlags As Long) As Long
 
Private Const HWND_TOPMOST = -1
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1

Anschließend müssen Sie noch die Create-Funktion um folgenden Code erweitern (fett hervorgehobener Code):

' Erzeugt das ToolTip-Fenster (mit einem weiteren Parameter)
Public Sub Create(ByVal hWndParent As Long, _
  Optional ByVal bAlwaysTip As Boolean = True, _
  Optional ByVal bBalloonTip As Boolean = True, _
  Optional ByVal bAlwaysOnTop As Boolean = True)
 
  Dim nFlags As Long
 
  ' Wir möchten kein normales Fenster
  nFlags = WS_POPUP Or TTS_NOPREFIX
 
  ' Falls der ToolTip auch bei deaktiviertem
  ' Control erscheinen soll...
  If bAlwaysTip Then nFlags = nFlags Or TTS_ALWAYSTIP
 
  ' Falls ein "moderner" Balloon-ToolTip erwünscht...
  If bBalloonTip Then nFlags = nFlags Or TTS_BALLOON
 
  ' Window-Handle erstellen
  m_hWnd = CreateWindowEx(0, "tooltips_class32", 0, _
    nFlags, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, _
    CW_USEDEFAULT, hWndParent, 0, App.hInstance, 0)
 
  ' Soll der ToolTip immer im Vordergrund erscheinen?
  If bAlwaysOnTop Then
    SetWindowPos m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, _
      SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE
  End If
 
  ' maximale Fensterbreite festlegen
  SendMessageLong m_hWnd, TTM_SETMAXTIPWIDTH, 0, m_lMaxWidth
End Sub

Calimero
Im Forum wurde gefragt, wie man die ToolTip-Texte während der Anzeige ändern kann.
Hierzu wurde die ToolTip-Klasse um nachfolgende neue Funktion erweitert:

' Neue Konstante im allgemeinen Bereich der Klasse
Private Const TTM_UPDATETIPTEXT = WM_USER + 12
' Neue Funktion zum Ändern des Titels, des Textes 
' und des Icons des ToolTip
Public Sub ChangeToolTipText(ctlTool As Object, strCaption As String, _
  Optional ByVal strTitle As String = "", _
  Optional ByVal iTitleIcon As eIconType = InfoIcon)
 
  Dim udtToolInfo As TOOLINFO
  With udtToolInfo
    .hWnd = ctlTool.hWnd
    .uId = ctlTool.hWnd
    .lpszText = strCaption
    .cbSize = Len(udtToolInfo)
  End With
 
  If CheckComCtl32Version Then
    If Len(strTitle) > 0 Then
      SendMessageStr m_hWnd, TTM_SETTITLE, iTitleIcon, strTitle
    Else
      SendMessageStr m_hWnd, TTM_SETTITLE, 0, ""
    End If
  End If
 
  SendMessage m_hWnd, TTM_UPDATETIPTEXT, 0, udtToolInfo
End Sub

Dieser Workshop wurde bereits 28.086 mal aufgerufen.

Über diesen Workshop im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Aktuelle Diskussion anzeigen (1 Beitrag)

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht 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