Findus | Jonathan (27.02.2013)
Ciao, Vielleicht kann das ja jemand gebrauchen: Eine Include, mit der man auf jedem beliebigen Fenster circa jedem beliebigen Bereich (relativ (0 bis 1) und absolut (Pixel)) einen Tooltip erzeugen kann, sogar mehrzeilig. Hier die Include: 'TOOLTIPS EVERYWHERE - TOOLTIP-INCLUDE FÜR TOOLTIPS AUF JEGLICHEN FENSTER-BEREICHEN
'==================================================================================
'
'(c) 2013 Jonathan
'Diese Include darf frei verwendet und modifiziert werden. Um einen Hinweis auf den
'ursprünglichen Autor wird gebeten, zumindest im Quellcode.
Struct TTE_lpPoint = X&, Y&
'{GLOBALE VARIABLEN
Declare TTE_Tooltip_hWnd&'Das Tooltip-Fenster
Declare TTE_Tooltip_text$[]'Text des Tooltips [X]
Declare TTE_Tooltip_grp&[]'Gruppe des Tooltips [X]
Declare TTE_Tooltip_tWnd&[]'Fenster des Tooltips [X]
Declare TTE_Tooltip_xpos![]'X-Position des Tooltip-Bereichs [X]
Declare TTE_Tooltip_ypos![]'Y-Position des Tooltip-Bereichs [X]
Declare TTE_Tooltip_xsz![]'X-Dimensione des Tooltip-Bereichs [X]
Declare TTE_Tooltip_ysz![]'Y-Dimensione des Tooltip-Bereichs [X]
Declare TTE_Tooltip_isRelative%[]'Relative Koordinaten per Tooltip [X]?
Declare TTE_Tooltip_aktnum&'Nummer des aktuell sichtbaren Tooltips
Declare TTE_Tooltip_aktmaxgrp&'Maximale vergebene Gruppen-ID
Declare TTE_DisplayFont$'Nichtproportionaler Font
Declare TTE_TempStr$
TTE_Tooltip_aktmaxgrp& = -1
TTE_Tooltip_aktnum& = -1
'}
'{INITIALISIEREN DES TOOLTIP-FENSTERS
WindowStyle 16 + 64 + 128 + 1024
TTE_Tooltip_hWnd& = @Create("Window", %hwnd, "", 0, 0, 128, 20)
@External("User32.dll", "SetWindowPos", TTE_Tooltip_hWnd&, ~HWND_TOPMOST, 0, 0, 0, 0, ~SWP_NOMOVE | ~SWP_NOSIZE | ~SWP_FRAMECHANGED)
StartPaint TTE_Tooltip_hWnd&
UsePen 5, 0, 0
UseBrush 1, 0
Rectangle 0, 0 - Width(TTE_Tooltip_hWnd&), Height(TTE_Tooltip_hWnd&)
EndPaint
ShowWindow(TTE_Tooltip_hWnd&, 0)
WindowStyle 1 + 2 + 4 + 8
'}
Proc TTE_ShowTooltip
Parameters X&, Y&, Text$
Declare Tooltip_imgbuffer&, TextLines$[], maxlen&
'@ShowWindow(Tooltip_hWnd&, 8)
TextLines$[] = @Explode(Text$, "\n")
maxlen& = 1
WhileLoop 0, @SizeOf(TextLines$[]) - 1
If @Len(TextLines$[&loop]) > maxlen&
maxlen& = @Len(TextLines$[&loop])
EndIf
EndWhile
Tooltip_imgbuffer& = @Create("hNewPic", 8 * maxlen&, 16 * @SizeOf(TextLines$[]), 0)
StartPaint Tooltip_imgbuffer&
WhileLoop 0, @SizeOf(TextLines$[]) - 1
UseFont TTE_displayFont$, 16, 8, 0, 0, 0
TextColor @Rgb(255, 255, 255), -1
DrawText 0, 16 * &loop, TextLines$[&loop]
EndWhile
EndPaint
~SetWindowPos(TTE_Tooltip_hWnd&, ~HWND_TOPMOST, X&, Y&, @Width(Tooltip_imgbuffer&), @Height(Tooltip_imgbuffer&), ~SWP_NOACTIVATE | ~SWP_NOOWNERZORDER | ~SWP_NOZORDER | ~SWP_SHOWWINDOW)
'SetWindowPos Tooltip_hWnd& = X&, Y& - @Width(Tooltip_imgbuffer&), @Height(Tooltip_imgbuffer&)
StartPaint TTE_Tooltip_hWnd&
DrawPic Tooltip_imgbuffer&, 0, 0; 0
EndPaint
DeleteObject Tooltip_imgbuffer&
EndProc
Proc TTE_HideTooltip
@ShowWindow(TTE_Tooltip_hWnd&, 0)
EndProc
Proc TTE_ToolTipRoutine
Declare MousePos#, X!, Y!, MousePosInWnd#
Dim MousePos#, TTE_lpPoint
Dim MousePosInWnd#, TTE_lpPoint
~GetCursorPos(MousePos#)
'Print MousePos#.X&, MousePos#.Y&
If TTE_Tooltip_aktnum& <> -1
MousePosInWnd# = MousePos#
~ScreenToClient(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&], MousePosInWnd#)
If TTE_Tooltip_isRelative%[TTE_Tooltip_aktnum&]
X! = MousePosInWnd#.X& / Width(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])
Y! = MousePosInWnd#.Y& / Height(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])
Else
X! = MousePosInWnd#.X&
Y! = MousePosInWnd#.Y&
EndIf
IfNot @Between(X!, TTE_Tooltip_xpos![TTE_Tooltip_aktnum&], TTE_Tooltip_xpos![TTE_Tooltip_aktnum&] + TTE_Tooltip_xsz![TTE_Tooltip_aktnum&], Y!, TTE_Tooltip_ypos![TTE_Tooltip_aktnum&], TTE_Tooltip_ypos![TTE_Tooltip_aktnum&] + TTE_Tooltip_ysz![TTE_Tooltip_aktnum&]) And (@GetActiveWindow() = TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])
TTE_Tooltip_aktnum& = -1
TTE_ToolTipRoutine
Else
TTE_ShowTooltip MousePos#.X& + 20, MousePos#.Y& + 20, TTE_Tooltip_text$[TTE_Tooltip_aktnum&]
'@SetActiveWindow(Tooltip_tWnd&[&loop])
EndIf
Else
WhileLoop 0, @SizeOf(TTE_Tooltip_text$[]) - 1
If (TTE_Tooltip_text$[&loop] <> "") And (@GetActiveWindow() = TTE_Tooltip_tWnd&[&loop]) And (TTE_Tooltip_tWnd&[&loop] <> -1)
MousePosInWnd# = MousePos#
~ScreenToClient(TTE_Tooltip_tWnd&[&loop], MousePosInWnd#)
If TTE_Tooltip_isRelative%[&loop]
X! = MousePosInWnd#.X& / Width(TTE_Tooltip_tWnd&[&loop])
Y! = MousePosInWnd#.Y& / Height(TTE_Tooltip_tWnd&[&loop])
Else
X! = MousePosInWnd#.X&
Y! = MousePosInWnd#.Y&
EndIf
If @Between(X!, TTE_Tooltip_xpos![&loop], TTE_Tooltip_xpos![&loop] + TTE_Tooltip_xsz![&loop], Y!, TTE_Tooltip_ypos![&loop], TTE_Tooltip_ypos![&loop] + TTE_Tooltip_ysz![&loop])
TTE_Tooltip_aktnum& = &loop
'@MessageBox(@Str$(Tooltip_aktnum&), "", 0)
BREAK
EndIf
EndIf
'@MessageBox(@Str$(Tooltip_aktnum&), "", 0)
EndWhile
If TTE_Tooltip_aktnum& = -1
TTE_HideTooltip
EndIf
EndIf
Dispose MousePos#
Dispose MousePosInWnd#
EndProc
Proc TTE_RegisterTooltip
Parameters tWnd&, X!, Y!, SZX!, SZY!, isRelative%, Group&, Text$
Declare freePos&
freePos& = -1
WhileLoop 0, @SizeOf(TTE_Tooltip_text$[]) - 1
If (TTE_Tooltip_text$[&loop] = "") And (TTE_Tooltip_tWnd&[&loop] = -1)
freePos& = &loop
BREAK
EndIf
EndWhile
If freePos& = -1
freePos& = @SizeOf(TTE_Tooltip_tWnd&[])
EndIf
'@MessageBox(@Str$(freePos&), "", 0)
TTE_Tooltip_tWnd&[freePos&] = tWnd&
TTE_Tooltip_xpos![freePos&] = X!
TTE_Tooltip_ypos![freePos&] = Y!
TTE_Tooltip_xsz![freePos&] = SZX!
TTE_Tooltip_ysz![freePos&] = SZY!
TTE_Tooltip_isRelative%[freePos&] = isRelative%
TTE_Tooltip_grp&[freePos&] = Group&
TTE_Tooltip_text$[freePos&] = Text$
'@MessageBox(@Str$(X!) + " " + @Str$(Y!) + " - " + @Str$(SZX!) + " " + @Str$(SZY!) + " = " + Text$, "", 0)
Return freePos&
EndProc
Proc TTE_UnregisterTooltip
Parameters Num&, Grp&
If Num& <> -1
TTE_Tooltip_text$[Num&] = ""
TTE_Tooltip_tWnd&[Num&] = -1
Else
WhileLoop 0, @SizeOf(TTE_Tooltip_tWnd&[]) - 1
If TTE_Tooltip_grp&[&loop] = Grp&
TTE_Tooltip_text$[&loop] = ""
TTE_Tooltip_tWnd&[&loop] = -1
EndIf
EndWhile
EndIf
EndProc
Proc TTE_GetNewTooltipGroupID
Inc TTE_Tooltip_aktmaxgrp&
Return TTE_Tooltip_aktmaxgrp&
EndProc
Proc TTE_SetTooltipFont
Parameters F$
TTE_DisplayFont$ = F$
EndProc
Proc TTE_destroyWnd
@DestroyWindow(TTE_Tooltip_hWnd&)
EndProc
Und hier ein kleines Beispiel-Programm: $H Windows.ph
$I TooltipsEverywhere.Inc
CLS
TTE_SetTooltipFont "Consolas"
TTE_RegisterTooltip %hwnd, 0, 0, .5, .5, 1, -1, "Links oben"
TTE_RegisterTooltip %hwnd, .5, 0, .5, .5, 1, -1, "Rechts oben"
TTE_RegisterTooltip %hwnd, 0, .5, .5, .5, 1, -1, "Links unten"
TTE_RegisterTooltip %hwnd, .5, .5, .5, .5, 1, -1, "Rechts unten"
UserMessages 16
WhileNot %umessage = 16
WaitInput 10
TTE_ToolTipRoutine
EndWhile
TTE_destroyWnd
Hat man einmal einen Tooltip erstellt, wird dieser automatisch angezeigt und ausgeblendet. Bei relativen Koordinaten wird der Tooltip bei einer Cambiamento der Fenstergröße automatisch neu positioniert. Man braucht sich also nicht mehr darum zu kümmern. TTE_ToolTipRoutine Muss einfach regelmäßig (z.B. in 20msec-Abständen) aufgerufen werden. Diese Routine prüft, welcher Tooltip aktiv ist, zeichnet ihn usw. TTE_RegisterTooltip tWnd, X, Y, SZX, SZY, isRelative, Group, Text Erstellt einen Tooltip auf Fenster tWnd an Position X, Y mit Dimensione SZX, SZY. Wenn isRelative = 1, werden die Koordinaten als Relativ angesehen, sodass man dort anstatt Pixeln Werte zwischen 0 und 1 eingibt. 1 bedeutet "volle Breite/Höhe des Fensters", zwischen 0 und 1 sind beliebige Abstufungen possibile. Bei "Group" kann man eine Gruppen-ID angeben, um mehrere Tooltips zu einer Gruppe zusammenzufassen. Wenn man keine Gruppe will, kann man -1 angeben. Text ist der Tooltip-Text, darin sind Zeilenumbrüche mit \n possibile. Returnwert: Handle des erstellten Tooltips. TTE_UnregisterTooltip H, Group Löscht den Tooltip mit dem Handle H. Ist H = -1, werden alle Tooltips der Gruppe mit der ID Group gelöscht. TTE_GetNewTooltipGroupID Erzeugt eine neue Gruppen-ID, die zum Zusammenfassen von Tooltips genutzt werden kann. Returnwert: Gruppen-ID TTE_SetTooltipFont S Setzt die Schriftart, die per Tooltips verwendet werden soll. Muss vor der ersten Ausführung von TTE_ToolTipRoutine eingestellt werden! TTE_destroyWnd Zerstört das Tooltip-Fenster. Muss bei Beenden des Programms corsa werden, danach darf TTE_ToolTipRoutine nicht mehr corsa werden! Die Include muss am Anfang des Programms eingebunden werden. Außerdem necessario sie Windows.ph. Saluto Jonathan |
|