Tried to summarize all functions into one code (still in two procedures, sorry) - just to have all parts to play around with:
Code: Select all
; Define
EnableExplicit
Global Dim ToolTipHandle(1)
; Icon from DataSection (icon format):
; DataSection // IconA: // IncludeBinary "Data\IconA.ico" // IconB: // IncludeBinary "Data\IconB.ico" // ... // EndDataSection
; Enumeration #IconA // #IconB // ... // EndEnumeration
; Global Dim IconTable(2) // IconTable(#IconA)=?IconA // ...
; Custom made Icon from PNG image:
;UsePNGImageDecoder()
;LoadImage(0,"c:\picture.png")
; EndDefine
Procedure.l GadgetToolTipText_(Win,ID,Title.s,Tip.s,IconType)
Protected ToolInfo.TOOLINFO
; If Len(Tip)=0 : Tip="(no Information)" : EndIf
; Windows 8: runde Ecken bei "einzeiligen" Tips, allerdings bleibt das Verhalten völlig undurchschaubar...
;If FindString(Tip,#CRLF$)=#Null
; Tip=" "+#CRLF$+Tip
;EndIf
ToolInfo\cbSize=SizeOf(TOOLINFO)
ToolInfo\hwnd=WindowID(Win)
ToolInfo\uId=GadgetID(ID)
ToolInfo\lpszText=@Tip
; ~~~ Icon and Title text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Default icon size:
; SendMessage_(ToolTipHandle(ID),#TTM_SETTITLE, LoadIcon_(#Null,IconType),@Title)
; Resize Icon:
SendMessage_(ToolTipHandle(ID),#TTM_SETTITLE, CopyImage_(LoadIcon_(#Null,IconType),#IMAGE_ICON,16,16,#LR_COPYDELETEORG),@Title)
; Icon from DataSection (needs code from define section above):
; SendMessage_(ToolTipHandle(ID),#TTM_SETTITLE,CatchImage(#IconTooltip,IconTable(IconType)),@Title)
; Custom made Icon from PNG image (needs code from define section above):
; small=CopyImage_(ImageID(0),#IMAGE_BITMAP,16,16,#LR_COPYDELETEORG)
; iinf.ICONINFO
; iinf\fIcon = 1
; iinf\hbmMask = small
; iinf\hbmColor = small
; icoHnd = CreateIconIndirect_(iinf)
; ~~~ Update Tooltip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SendMessage_(ToolTipHandle(ID),#TTM_UPDATETIPTEXT,0,@ToolInfo)
;SendMessage_(ToolTipHandle(ID),#TTM_UPDATE,0,@ToolInfo)
EndProcedure
Procedure.l GadgetToolTipInit_(Win,ID,Style,Center,Color=0,FontType=0)
; Adds a tooltip to a Gadget (Id)
; Style: 0= ordinary, 1= balloon
; Center: 1= center the stem
; Icon: 0= No icon, 1= Info, 2= Warn, 3= Error (#TOOLTIP_ constants)
; Colors: RGB() or GetSysColor_(#COLOR_ constants)
; Wegen Windows-Bugs (Tooltip verschwindet nach Timeout auf ewig) nun global...
Protected ToolTipID
Protected ToolInfo.TOOLINFO
ToolTipID=CreateWindowEx_(0,"Tooltips_Class32","",#TTS_NOPREFIX|#TTS_BALLOON*Style,0,0,0,0,0,0,0,0)
; ~~~ Tooltip Colors ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If Color
SetWindowTheme_(ToolTipID,"","")
SendMessage_(ToolTipID,#TTM_SETTIPBKCOLOR,Color,0); Set the tip background color
;If TextColor
; SendMessage_(ToolTipID,#TTM_SETTIPTEXTCOLOR,TextColor,0); Set the tip text color, also the tip outline color for balloon tooltips
;EndIf
EndIf
; ~~~ Initialize Tooltip ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ToolInfo\cbSize=SizeOf(TOOLINFO)
ToolInfo\uFlags=#TTF_IDISHWND|#TTF_SUBCLASS|(#TTF_CENTERTIP*Center)
ToolInfo\hWnd=WindowID(Win)
ToolInfo\uId=GadgetID(ID)
ToolInfo\lpszText=@""
SendMessage_(ToolTipID,#TTM_SETDELAYTIME,#TTDT_INITIAL,100)
;SendMessage_(ToolTipID,#TTM_SETDELAYTIME,#TTDT_RESHOW,1000); ?????
SendMessage_(ToolTipID,#TTM_SETDELAYTIME,#TTDT_AUTOPOP,30000)
SendMessage_(ToolTipID,#TTM_ADDTOOL,0,ToolInfo); Register tooltip with the control
SendMessage_(ToolTipID,#TTM_SETMAXTIPWIDTH,0,250); Set as a multiline tooltip with wordwrap
SendMessage_(ToolTipID,#TTM_SETTITLE,0,@""); Set the icon style and tip title (empty text = no tooltip)
; ~~~ Title font ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If FontType
LoadFont(FontType,"Segoe UI",24,#PB_Font_HighQuality)
SendMessage_(ToolTipID,#WM_SETFONT,FontID(FontType),#True)
EndIf
ToolTipHandle(ID)=ToolTipID
;Debug "Init "+Str(ID)+" ("+Str(ToolTipID)+")"
ProcedureReturn ToolTipID
EndProcedure
OpenWindow(0,0,0,400,320,"*",#PB_Window_ScreenCentered)
ButtonGadget(0,50,50,300,100,"A")
ButtonGadget(1,50,170,300,100,"B")
AddWindowTimer(0,0,1000)
GadgetToolTipInit_(0,0,0,0,#Yellow,1)
GadgetToolTipInit_(0,1,0,0,#Null,1)
Define text.s
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Timer
If 0
text=FormatDate("%hh:%ii:%ss", Date())
Else
text=RSet("",Random(18)+1,">")
EndIf
GadgetToolTipText_(0,0,"Aaah",text,#IDI_WARNING);
GadgetToolTipText_(0,1,"Oooh",text,#IDI_INFORMATION);
EndSelect
ForEver