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:
Aber erst noch einmal etwas sehr wichtiges vorweg: 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 ' 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 ' 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 ' 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 ' 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 ' 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 ' 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 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 ' 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.
Anzeige
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. |
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. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. 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... |
|||||||||||||
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. |