Tooltip Manager ( customize the default PB tooltip )

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Tooltip Manager ( customize the default PB tooltip )

Post by eddy »

v1.1 for PB4.20 & 4.30

You can customize the default PB tooltip display and behaviour. ( without creating a new one )
convert it to balloon tooltip

Code: Select all

;{ Utils
Enumeration
   #TOOLTIPM_NO_ICON=0
   #TOOLTIPM_INFO_ICON
   #TOOLTIPM_WARNING_ICON
   #TOOLTIPM_ERROR_ICON
EndEnumeration
Structure TooltipManagerParams
   ID.l
   IsBalloon.l
   ColorText.l
   ColorBack.l
   Title.s
   IconForTitle.l
   MaxWidth.l
   Manager.l
EndStructure
Global NewList TooltipManagers.TooltipManagerParams()
Procedure FindDefaultTooltipManager(Window, unused)
   ; ==========================================
   ; Find Default Purebasic TOOLTIP Handle
   ; ==========================================
   Protected WindowClass.s=Space(255)
   If GetClassName_(Window, @WindowClass, Len(WindowClass))
      If LCase(WindowClass)=LCase("ToolTips_Class32")
         If GetWindowThreadProcessId_(Window, 0)=GetCurrentThreadId_()
            
            AddElement(TooltipManagers())
            TooltipManagers()\Title=""
            TooltipManagers()\IconForTitle=0
            TooltipManagers()\IsBalloon=GetWindowLong_(Window, #GWL_STYLE)
            TooltipManagers()\MaxWidth=SendMessage_(Window, #TTM_GETMAXTIPWIDTH, 0, 0)
            TooltipManagers()\ColorText=SendMessage_(Window, #TTM_GETTIPTEXTCOLOR, 0, 0)
            TooltipManagers()\ColorBack=SendMessage_(Window, #TTM_GETTIPBKCOLOR, 0, 0)
            TooltipManagers()\ID=#PB_Ignore
            TooltipManagers()\Manager=Window
            
            ProcedureReturn 0
         EndIf
      EndIf
   EndIf
   ProcedureReturn 1
EndProcedure
;}

;{ TooltipManager Functions
ProcedureDLL.b UseTooltipManager(ID=#PB_Ignore) ;Use specific TooltipManager, returns true if success
   ForEach TooltipManagers()
      If TooltipManagers()\ID=ID
         ; ====================
         ; Modify Parameters
         ; ====================
         Protected TooltipManager=TooltipManagers()\Manager
         SetWindowLong_(TooltipManager, #GWL_STYLE, TooltipManagers()\IsBalloon)
         SendMessage_(TooltipManager, #TTM_SETTIPTEXTCOLOR, TooltipManagers()\ColorText, 0)
         SendMessage_(TooltipManager, #TTM_SETTIPBKCOLOR, TooltipManagers()\ColorBack, 0)
         SendMessage_(TooltipManager, #TTM_SETTITLE, TooltipManagers()\IconForTitle, TooltipManagers()\Title)
         SendMessage_(TooltipManager, #TTM_SETMAXTIPWIDTH, 0, TooltipManagers()\MaxWidth)
         ; SetWindowLong_(TooltipManager,#GWL_EXSTYLE,#WS_EX_TOPMOST) ;If StickWindow enabled
         ; SendMessage_(TooltipManager,#TTM_SETDELAYTIME,#TTDT_INITIAL,200)
         ; SendMessage_(TooltipManager,#TTM_SETDELAYTIME,#TTDT_AUTOPOP,10000)
         ; ====================
         ; Refresh Content
         ; ====================
         SendMessage_(TooltipManager, #TTM_UPDATE, 0, 0)
         ProcedureReturn #True
      EndIf
   Next
   
   ProcedureReturn #False
EndProcedure
ProcedureDLL.l CreateTooltipManager(ID, IsBalloon=#False, ColorText=#PB_Ignore, ColorBack=#PB_Ignore, Title.s="", IconForTitle=#PB_Ignore, MaxWidth=#PB_Ignore) ;Create TooltipManager, returns non-zero if success
   If ID=#PB_Ignore
      ProcedureReturn 0
   EndIf
   
   CompilerIf #PB_Compiler_Version<430
      Protected TooltipManagersCount=CountList(TooltipManagers())
   CompilerElse
      Protected TooltipManagersCount=ListSize(TooltipManagers())
   CompilerEndIf
   
   If TooltipManagersCount=0
      ; ==========================================
      ; Start Default Purebasic TOOLTIP
      ; ==========================================
      Protected ButtonWithTip=ButtonGadget(#PB_Any, 10, 30, 250, 30, "New Button with Tooltip")
      If ButtonWithTip And IsGadget(ButtonWithTip)
         GadgetToolTip(ButtonWithTip, "New Tooltip")
         FreeGadget(ButtonWithTip)
         
         ;find the default tooltip handle...
         EnumWindows_(@FindDefaultTooltipManager(), #Null)
      EndIf
   EndIf
   
   CompilerIf #PB_Compiler_Version<430
      TooltipManagersCount=CountList(TooltipManagers())
   CompilerElse
      TooltipManagersCount=ListSize(TooltipManagers())
   CompilerEndIf
   
   If TooltipManagersCount And IsBalloon<>#PB_Ignore
      ; ==========================================
      ; Overwrite existing TooltipManager ID
      ; (If necessary)
      ; ==========================================
      ForEach TooltipManagers()
         If TooltipManagers()\ID=ID
            DeleteElement(TooltipManagers())
            Break
         EndIf
      Next
      
      ; ==========================================
      ; Register new TooltipManager ID
      ; (With Or without Default parameters)
      ; ==========================================
      UseTooltipManager()
      Protected DefaultIsBalloon=TooltipManagers()\IsBalloon
      Protected DefaultColorText=TooltipManagers()\ColorText
      Protected DefaultColorBack=TooltipManagers()\ColorBack
      Protected DefaultMaxWidth=TooltipManagers()\MaxWidth
      Protected DefaultManager=TooltipManagers()\Manager
      
      AddElement(TooltipManagers())
      TooltipManagers()\ID=ID
      If IsBalloon=#False
         TooltipManagers()\IsBalloon=DefaultIsBalloon
      Else
         TooltipManagers()\IsBalloon=#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON | #TTS_ALWAYSTIP
      EndIf
      If ColorText=#PB_Ignore
         TooltipManagers()\ColorText=DefaultColorText
      Else
         TooltipManagers()\ColorText=ColorText
      EndIf
      If ColorBack=#PB_Ignore
         TooltipManagers()\ColorBack=DefaultColorBack
      Else
         TooltipManagers()\ColorBack=ColorBack
      EndIf
      If MaxWidth=#PB_Ignore
         TooltipManagers()\MaxWidth=DefaultMaxWidth
      Else
         TooltipManagers()\MaxWidth=MaxWidth
      EndIf
      If IconForTitle=#PB_Ignore
         TooltipManagers()\IconForTitle=#TOOLTIPM_INFO_ICON
      Else
         TooltipManagers()\IconForTitle=IconForTitle
      EndIf
      TooltipManagers()\Title=Left(Trim(Title), 255)
      TooltipManagers()\Manager=DefaultManager
      
      ProcedureReturn TooltipManagers()\Manager
   EndIf
EndProcedure
;}

; ====================
; EXAMPLE
; ====================
OpenWindow(0, 0, 0, 270, 200, "Customize Gadget Tooltip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CompilerIf #PB_Compiler_Version<430
   CreateGadgetList(WindowID(0))
CompilerEndIf

CreateTooltipManager(0, #True)
CreateTooltipManager(1, #True, #PB_Ignore, $0000FF, "1", #TOOLTIPM_WARNING_ICON)
CreateTooltipManager(2, #False, RGB(64, 255, 64), RGB(64, 64, 64) , "2", #TOOLTIPM_NO_ICON, 50)
UseTooltipManager(0)

ButtonGadget(10, 10, 10, 250, 30, "TooltipManager 0")
ButtonGadget(11, 10, 50, 250, 30, "TooltipManager 1")
ButtonGadget(12, 10, 90, 250, 30, "TooltipManager 2")
ButtonGadget(20, 10, 130, 250, 30, "Default PUREBASIC TooltipManager")
GadgetToolTip(10, "10 > Super long tooltip message here !!...")
GadgetToolTip(11, "11 > Super long tooltip message here !!...")
GadgetToolTip(12, "12 > Super long tooltip message here !!...")
GadgetToolTip(20, "20 > Super long tooltip message here !!...")

Repeat
   If EventType()=#PB_EventType_LeftClick
      Select EventGadget()
         Case 10
            UseTooltipManager(0)
         Case 11
            UseTooltipManager(1)
         Case 12
            UseTooltipManager(2)
         Case 20
            UseTooltipManager()
      EndSelect
   EndIf
Until WaitWindowEvent()=#PB_Event_CloseWindow
Last edited by eddy on Sat Sep 20, 2008 6:59 pm, edited 9 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4791
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Post by Fangbeast »

Hi Eddy, good examples. Always good to see more ways of doing this and I have been doing something similar for one program that does sql queries for addresses.

By the way, you have a minor syntax error on this line.

CreateTooltipManager(1,#True,#PB_Ignore,$66FFCC,"QuickHelp#TOOLTIPM_WARNING_ICON)

Should be.

CreateTooltipManager(1,#True,#PB_Ignore,$66FFCC,"QuickHelp", #TOOLTIPM_WARNING_ICON)

I do this all the time. Miracle that I can type at all:)
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Post by rsts »

Nice :)

Thanks for sharing.

cheers
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

Code: Select all

By the way, you have a minor syntax error on this line. 
Fixed
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
SofT MANiAC
Enthusiast
Enthusiast
Posts: 142
Joined: Mon Sep 17, 2007 10:28 am
Location: P.O.P
Contact:

Post by SofT MANiAC »

8) I like it
POiNT.OF.PRESENCE group
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Post by Kwai chang caine »

Great code EDDY 8)
But it don't works in v4.20 Beta2 :cry:
ImageThe happiness is a road...
Not a destination
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

Kwaï chang caïne wrote:Great code EDDY 8)
But it don't works in v4.20 Beta2 :cry:
ah why ? Does it compile ?
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
milan1612
Addict
Addict
Posts: 894
Joined: Thu Apr 05, 2007 12:15 am
Location: Nuremberg, Germany
Contact:

Post by milan1612 »

I get an IMA in line 52 when compiling with debugger enabled :?
Windows 7 & PureBasic 4.4
UserOfPure
Enthusiast
Enthusiast
Posts: 469
Joined: Sun Mar 16, 2008 9:18 am

Re: Tooltip Manager ( customize the default PB tooltip )

Post by UserOfPure »

eddy wrote:Enumeration
#TOOLTIPM_NO_ICON = 0
#TOOLTIPM_INFO_ICON = 1
#TOOLTIPM_WARNING_ICON = 2
#TOOLTIPM_ERROR_ICON = 3
EndEnumeration
Just a tip: if you're going to assign numeric values to a constant like that, then wrapping them in Enumeration isn't needed. Enumeration is for when you're NOT assigning a value. ;)
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

[ Updated ]
- remove useless global variables
- UseTooltipManager simplified

Code: Select all

success.b = UseTooltipManager(ID) ;Use specific TooltipManager, returns true if success 

UseTooltipManager() ;Use default purebasic TooltipManager
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
Marco2007
Enthusiast
Enthusiast
Posts: 648
Joined: Tue Jun 12, 2007 10:30 am
Location: not there...

Post by Marco2007 »

Great! Very Useful! :D
PureBasic for Windows
Fred
Administrator
Administrator
Posts: 18251
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

The callback provided to EnumWindows_() doesn't look right..
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

yes... It's perhaps the reason why this code does not compile with PB v4.20 Beta2.

I tried to reduce the size of code, but in the original version there's 3 functions
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
ricardo
Addict
Addict
Posts: 2438
Joined: Fri Apr 25, 2003 7:06 pm
Location: Argentina

Post by ricardo »

Dont works in PB 4.20
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Post by eddy »

I see no problem with the last version
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
Post Reply