Personal adaptation (for the example) from codes provided by Sparks, Andre, Falsam & Rashad (see links).
1) Tooltip displayed only if label or checkbox is hovered.
Code: Select all
; PB links
; https://www.purebasic.fr/english/viewtopic.php?p=635240#p635240
; https://www.purebasic.fr/english/viewtopic.php?p=364256#p364256
; External links
; https://learn.microsoft.com/en-us/windows/win32/controls/tvm-maphtreeitemtoaccid
; https://github.com/tpn/winsdk-10/blob/master/Include/10.0.16299.0/um/CommCtrl.h
;
EnableExplicit
#TVM_MAPHTREEITEMTOACCID=#TV_FIRST+43
;
#WINDOW=1 ; 1 to make sure everything works properly, but can be any value, of course !
#TREEVVIEW=1
;
Global.i IdToolTip
Define.a Count
;
Procedure.i Fc_ToolTip_Creation(ArgWindowNr.i,ArgGadgetNr.i,ArgTitle.s,ArgText.s,ArgMaxLength.u=0,ArgFlags.u=0)
Protected.TOOLINFO TOOLINFO
Protected.i IdToolTip
ArgFlags|#TTS_NOPREFIX ; Other possible options : |#TTS_BALLOON|#TTS_CLOSE
IdToolTip=CreateWindowEx_(0,"ToolTips_Class32","",ArgFlags,0,0,0,0,WindowID(ArgWindowNr),0,GetModuleHandle_(0),0)
SendMessage_(IdToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
SendMessage_(IdToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
If ArgMaxLength=0:ArgMaxLength=2000:EndIf
SendMessage_(IdToolTip,#TTM_SETMAXTIPWIDTH,0,ArgMaxLength)
;
With TOOLINFO
\cbSize=SizeOf(TOOLINFO)
\uFlags=#TTF_SUBCLASS|#TTF_IDISHWND
\hWnd=WindowID(ArgWindowNr)
\uId=GadgetID(ArgGadgetNr)
\hinst=0
\lpszText=@ArgText
EndWith
SendMessage_(IdToolTip,#TTM_ADDTOOL,0,TOOLINFO)
SendMessage_(IdToolTip,#TTM_SETDELAYTIME,#TTDT_AUTOPOP,15000)
If ArgTitle
SendMessage_(IdToolTip,#TTM_SETTITLE,0,@ArgTitle)
EndIf
SendMessage_(IdToolTip,#TTM_UPDATE,0,0)
ProcedureReturn IdToolTip
EndProcedure
Procedure Pc_ToolTip_Modification(ArgIdToolTip.i,ArgWindowNr.i,ArgGadgetNr.u,ArgTitle.s,ArgText.s)
Protected.TOOLINFO TOOLINFO
With TOOLINFO
\cbSize=SizeOf(TOOLINFO)
\hWnd=WindowID(ArgWindowNr)
\uId=GadgetID(ArgGadgetNr)
\lpszText=@ArgText
EndWith
If ArgTitle
SendMessage_(ArgIdToolTip,#TTM_SETTITLE,0,@ArgTitle)
EndIf
SendMessage_(ArgIdToolTip,#TTM_UPDATETIPTEXT,0,TOOLINFO)
EndProcedure
Procedure Pc_ToolTip_Display(ArgWindowNr.i,ArgGadgetNr.i)
Protected.TV_HITTESTINFO TVHITTESTINFO
Protected.i IdItem,Item
Protected.s String
GetCursorPos_(@TVHITTESTINFO\pt)
ScreenToClient_(GadgetID(ArgGadgetNr),@TVHITTESTINFO\pt)
IdItem=SendMessage_(GadgetID(ArgGadgetNr),#TVM_HITTEST,0,TVHITTESTINFO)
Item=SendMessage_(GadgetID(ArgGadgetNr),#TVM_MAPHTREEITEMTOACCID,IdItem,0)-1
;
; Zones de l'item survolées (Item hovered zones) : TVHITTESTINFO\flags
; #TVHT_NOWHERE : 1 -> TVHITTESTINFO\flags&1
; #TVHT_ONITEMICON : 2 -> TVHITTESTINFO\flags>>1&1
; #TVHT_ONITEMLABEL : 4 -> TVHITTESTINFO\flags>>2&1
; #TVHT_ONITEMINDENT : 8 -> TVHITTESTINFO\flags>>3&1
; #TVHT_ONITEMBUTTON : 16 -> TVHITTESTINFO\flags>>4&1
; #TVHT_ONITEMRIGHT : 32 -> TVHITTESTINFO\flags>>5&1
; #TVHT_ONITEMSTATEICON : 64 -> TVHITTESTINFO\flags>>6&1
; #TVHT_ONITEM : 70 -> Bool(TVHITTESTINFO\flags&70=70)
; #TVHT_ABOVE : 256 -> TVHITTESTINFO\flags>>8&1
; #TVHT_BELOW : 512 -> TVHITTESTINFO\flags>>9&1
; #TVHT_TORIGHT : 1024 -> TVHITTESTINFO\flags>>10&1
; #TVHT_TOLEFT : 2048 -> TVHITTESTINFO\flags>>11&1
;
If Item>=0 And (TVHITTESTINFO\flags>>2&1 Or TVHITTESTINFO\flags>>6&1):String=GetGadgetItemText(ArgGadgetNr,Item):EndIf
; Multiline if item sublevel > 0
If String
If GetGadgetItemAttribute(ArgGadgetNr,Item,#PB_Tree_SubLevel)>0
String+#CRLF$+"Subitem level : "+Str(GetGadgetItemAttribute(ArgGadgetNr,Item,#PB_Tree_SubLevel))
EndIf
EndIf
If IdToolTip=0 And Item>=0
IdToolTip=Fc_ToolTip_Creation(ArgWindowNr,ArgGadgetNr,"Title "+String,String,200)
Else
Pc_ToolTip_Modification(IdToolTip,ArgWindowNr,ArgGadgetNr,"Title "+String,String)
EndIf
; SetGadgetState(ArgGadgetNr,Item) ; Select hovered item
EndProcedure
;
If OpenWindow(#WINDOW,0,0,400,600,"TreeGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TreeGadget(#TREEVVIEW,10,10,380,280,#PB_Tree_CheckBoxes)
For Count=0 To 1
AddGadgetItem (#TREEVVIEW,-1,"Normal Item "+Str(Count),0,0)
AddGadgetItem (#TREEVVIEW,-1,"Node "+Str(Count),0,0)
AddGadgetItem(#TREEVVIEW,-1,"Sub-Item 1",0,1)
AddGadgetItem(#TREEVVIEW,-1,"Sub-Item 2",0,1)
AddGadgetItem(#TREEVVIEW,-1,"Sub-Item 3",0,1)
AddGadgetItem(#TREEVVIEW,-1,"Sub-Item 4",0,1)
AddGadgetItem (#TREEVVIEW,-1,"File "+Str(Count),0,0)
Next
SetActiveGadget(#TREEVVIEW)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow:Break
Case #WM_MOUSEMOVE:Pc_ToolTip_Display(#WINDOW,#TREEVVIEW)
EndSelect
ForEver
EndIf