Page 1 sur 1

Bulle d'aide multiligne (Window)

Publié : mar. 18/oct./2011 20:38
par falsam
Syntaxe
BalloonTip(Gadget,TipTitle.s, TipText.s, [TipIcon.i], [TipFontId.i], [TipBackColor.i], [TipFrontColor.i])

Permet d'afficher une icone, un titre et plusieurs lignes d'aide dans une bulle d'aide.

Code : Tout sélectionner

;BalloonTip 

;Syntaxe : BalloonTip(Gadget,TipTitle.s, TipText.s, [TipIcon.i], [TipFontId.i], [TipBackColor.i], [TipFrontColor.i])
;
;Gadget       : Gadget concerné
;TipTitle     : Titre de l'aide
;TipText      : Texte de l'aide
;
;En option :
;TipIcon      : Icon à afficher 
;               #TOOLTIP_WARNING_ICON - #TOOLTIP_ERROR_ICON - #TOOLTIP_INFO_ICON - #TOOLTIP_NO_ICON (Defaut)
;
;TipFontId    : Id Police de caractére 
;TipBackColor : Couleur d'arriére plan
;TipFrontColor: Couleur de police 
;

Procedure BalloonTip(Gadget.l, TipTitle.s, TipText.s, TipIcon=#TOOLTIP_NO_ICON, TipFontId=0, TipBackColor.i=0, TipFrontColor=0)
  Protected ToolTip.l, Balloon.TOOLINFO
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP|#TTS_NOPREFIX|#TTS_BALLOON,0,0,0,0,GadgetID(Gadget),0,GetModuleHandle_(0),0)
  
  Balloon\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
 ;Balloon\hWnd=GadgetID(Gadget)
  Balloon\uId=GadgetID(Gadget)
  Balloon\lpszText = @TipText
  
  If TipFontID<>0
    SendMessage_(ToolTip, #WM_SETFONT, TipFontID, 0)
  EndIf  
  
  If Not(TipBackColor=0 And TipFrontColor=0)
    SetWindowTheme_(ToolTip, #NUL$, #NUL$)
    SendMessage_(ToolTip, #TTM_SETTIPTEXTCOLOR, TipFrontColor,0)
    SendMessage_(ToolTip, #TTM_SETTIPBKCOLOR, TipBackColor,0)
  EndIf  
  
  SendMessage_(ToolTip, #TTM_SETTITLE, TipIcon, @TipTitle)
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
EndProcedure


;/////// TEST //////////////////////////////////////////////////////////
EnableExplicit

Enumeration
  #Mainform
  #Button1
  #Button2
EndEnumeration

Global FontID1.l

OpenWindow(#Mainform, 235, 2, 400, 200, "ToolTip Test",  #PB_Window_SystemMenu |#PB_Window_ScreenCentered )    
ButtonGadget(#Button1, 300, 10, 80, 22, "Bouton 1")
BalloonTip(#Button1, "Titre de l'aide 1", "Ligne 1", #TOOLTIP_WARNING_ICON, 0, $CCF9FF, #Black)

FontID1 = LoadFont(1, "Arial", 12, #PB_Font_HighQuality)
ButtonGadget(#Button2, 300, 35, 80, 22, "Bouton 2")
BalloonTip(#Button2,"Titre de l'aide 2", "Ligne 1" +#CRLF$+ "Ligne 2" +#CRLF$+ "Ligne 3", #TOOLTIP_WARNING_ICON, FontId1)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect  
ForEver
Ce code ne fonctionne pas en remplacement de ToolBarToolTip() et SysTrayIconToolTip()

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 9:09
par GG
Super Falsam, merci.

A mettre dans PB Contributions si ce n'est déjà fait !

Autre solution que m'a proposé gnozal sur >> le forum UK <<:

Code : Tout sélectionner

Structure PB_Globals
  CurrentWindow.i
  FirstOptionGadget.i
  DefaultFont.i
  *PanelStack
  PanelStackIndex.l
  PanelStackSize.l
  ToolTipWindow.i
EndStructure

Import ""
  PB_Object_GetThreadMemory(*Mem)
  PB_Gadget_Globals
EndImport

Procedure ToolTipID()
  Protected *PB_Globals.PB_Globals
  *PB_Globals = PB_Object_GetThreadMemory(PB_Gadget_Globals)
  ProcedureReturn *PB_Globals\ToolTipWindow
EndProcedure

OpenWindow(0,0,0,320,240,"")
StringGadget(1,20,40,200,20,"stuff")
GadgetToolTip(1, "This is a tooltip        with multiple lines  ")
ttid = ToolTipID()
SendMessage_(ttid, #TTM_SETMAXTIPWIDTH, 0, 100)
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
et netmaestro :

Code : Tout sélectionner

Procedure TT_CBTHookProc(nCode, wParam, lParam)
  Shared _Hook, TT_HWND
  Select nCode
    Case #HCBT_CREATEWND
      *pcbt.CBT_CREATEWND = lParam
      *pcs.CREATESTRUCT = *pcbt\lpcs
      Select PeekS(*pcs\lpszClass)
        Case "tooltips_class32"
          TT_HWND = wParam
      EndSelect
  EndSelect
  ProcedureReturn CallNextHookEx_(_Hook, nCode, wParam, lParam)
EndProcedure

Procedure GadgetToolTipEx(gadget_number, tooltip_text$)
  Shared _Hook, TT_HWND
  _Hook = SetWindowsHookEx_(#WH_CBT, @TT_CBTHookProc(), #Null, GetCurrentThreadId_())
  GadgetToolTip(gadget_number, tooltip_text$)
  UnhookWindowsHookEx_(_Hook)
  ProcedureReturn TT_HWND
EndProcedure

OpenWindow(0,0,0,320,240,"")
StringGadget(1,20,40,200,20,"stuff")
ttid = GadgetToolTipEx(1, "This is a tooltip        with multiple lines  ")
SendMessage_(ttid, #TTM_SETMAXTIPWIDTH, 0, 100)
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
A mettre dans PB Contrib également je pense.

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 9:29
par Ar-S
De très bon codes ça merci !
Sympa l'icone ajoutée Falsam.

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 9:44
par falsam
@GG :
Je crois que je préfère ma petite procédure que je stocke sous forme d'include. Je la trouve plus sexy :)

Je préfère faire.

Code : Tout sélectionner

ButtonGadget(#Button1, 300, 10, 80, 22, "Bouton 1")
BalloonTip(#Button1, "Titre de l'aide 1", "Ligne 1", #TOOLTIP_WARNING_ICON, 0, $CCF9FF, #Black)
plutôt que

Code : Tout sélectionner

StringGadget(1,20,40,200,20,"stuff")
GadgetToolTip(1, "This is a tooltip        with multiple lines  ")
ttid = ToolTipID()
SendMessage_(ttid, #TTM_SETMAXTIPWIDTH, 0, 100)
De plus on peut ajouter un titre et changer le style de la bulle (Couleur de fond, couleur de caractére, Changement de font)

Quand à PB Contribution, L'outils ne séduisant pas, je pense que je vais arrêter là le dev.
Ar-S a écrit :Sympa l'icone ajoutée Falsam.
3 icônes possibles
#TOOLTIP_WARNING_ICON
#TOOLTIP_ERROR_ICON
#TOOLTIP_INFO_ICON

ou pas d'icone
#TOOLTIP_NO_ICON (Defaut)

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 10:00
par GG
Je plussoie concernant l'intégration de la procédure.
Pour PB Contributions, ce serait dommage, car bien pratique pour stocker des bouts de code que l'on peut réutiliser par ci par là, et cela permet de centraliser cette richesse d'informations plutôt que de papillonner dans le forum...

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 12:43
par GallyHC
Bonjour falsam,

Vraiment cool comme code je vais surement l'utilisé. Je vais voir si cela est utilisable avec le systray :)

Cordialement,
GallyHC

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 12:52
par falsam
Bonjour GallyHC, j'ai effectivement oublié de faire ce test. je compte sur toi :)
Si tu pouvez poster un code exemple. Merciiii.

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 14:52
par falsam
Ce code ne fonctionne pas en remplacement de ToolBarToolTip() et SysTrayIconToolTip()

J'ai commenté Balloon\hWnd=GadgetID(Gadget). Ca ne sert à rien et c'est une erreur.
je ne suis pas familiarisé avec les APi (Même que je déteste), je pense que c'est la fenêtre qui contient le gadget qu'il fallait indiquer et non pas le gadget lui même (Qui est lui aussi est une fenêtre). Apparement ça n'a pas d'incidence sur l’exécution.

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 15:56
par Le Soldat Inconnu
Terrible la solution de Gnozal et Netmaestro :D

Une version simplifiée à l'utilisation du codes de Gnozal. Pour les fainéants, comme moi, qui aime bien avoir une fonction qui intègre tout pour être simple à utiliser :mrgreen:

Code : Tout sélectionner

;{ GadgetToolTipEx Import
Structure PB_Globals
	CurrentWindow.i
	FirstOptionGadget.i
	DefaultFont.i
	*PanelStack
	PanelStackIndex.l
	PanelStackSize.l
	ToolTipWindow.i
EndStructure

Import ""
	PB_Object_GetThreadMemory(*Mem)
	PB_Gadget_Globals
EndImport
;} 
Procedure GadgetToolTipEx(Gadget, Text.s, Width.l = 128)
	Protected *PB_Globals.PB_Globals
	
	GadgetToolTip(Gadget, Text)
	*PB_Globals = PB_Object_GetThreadMemory(PB_Gadget_Globals)
	SendMessage_(*PB_Globals\ToolTipWindow, #TTM_SETMAXTIPWIDTH, 0, Width)
	
EndProcedure

; Début du code

OpenWindow(0, 0, 0, 320, 240, "ToolTip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(1, 4, 4, 200, 40, "ToolTip 1")
GadgetToolTipEx(1, "This is a tooltip with multiple lines", 100)

ButtonGadget(2, 4, 64, 200, 40, "ToolTip 2")
GadgetToolTipEx(2, "This is a tooltip with multiple lines")

Repeat
	
	Event = WaitWindowEvent()
	
Until Event = #PB_Event_CloseWindow

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 16:02
par Le Soldat Inconnu
Heu, je viens de voir un truc. Est-ce que les 2 tooltips sont multilignes chez vous aussi ? (à tester sous XP si possible)

Code : Tout sélectionner

;{ GadgetToolTipEx Import
Structure PB_Globals
	CurrentWindow.i
	FirstOptionGadget.i
	DefaultFont.i
	*PanelStack
	PanelStackIndex.l
	PanelStackSize.l
	ToolTipWindow.i
EndStructure

Import ""
	PB_Object_GetThreadMemory(*Mem)
	PB_Gadget_Globals
EndImport
;} 
Procedure GadgetToolTipMultipleLine(Width.l = 128)
	Protected *PB_Globals.PB_Globals

	*PB_Globals = PB_Object_GetThreadMemory(PB_Gadget_Globals)
	SendMessage_(*PB_Globals\ToolTipWindow, #TTM_SETMAXTIPWIDTH, 0, Width)
	
EndProcedure

; Début du code

OpenWindow(0, 0, 0, 320, 240, "ToolTip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ButtonGadget(1, 4, 4, 200, 40, "ToolTip 1")
GadgetToolTip(1, "This is a tooltip with multiple lines 1")
GadgetToolTipMultipleLine()

ButtonGadget(2, 4, 64, 200, 40, "ToolTip 2")
GadgetToolTip(2, "This is a tooltip with multiple lines 2")

Repeat
	
	Event = WaitWindowEvent()
	
Until Event = #PB_Event_CloseWindow

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 16:23
par falsam
@GallyHC: Pour une bulle d'aide multilignes sur un SysTray tu peux utiliser Chr(13) ou #CRLF$ pour séparer chaque ligne.

Code : Tout sélectionner

OpenWindow(0, 100, 150, 300, 100, "SysTray Test", #PB_Window_SystemMenu)

AddSysTrayIcon(1, WindowID(0), LoadIcon_(#Null, #IDI_ASTERISK))
AddSysTrayIcon(2, WindowID(0), LoadIcon_(#Null, #IDI_WARNING))

SysTrayIconToolTip(1, "Ligne 1" +#CRLF$+ "ligne 2")
SysTrayIconToolTip(2, "Ligne 1" +#CRLF$+ "ligne 2")

Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
      
  EndSelect
  
ForEver

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 16:35
par MLD
@ Soldat

Bonjour

Oui les deux code fonctionnent en multilignes sur XP.
A+

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 16:43
par GG
Oui, multilignes sous XP SP3 32 bits.

Re: Bulle d'aide multiligne (Window)

Publié : mer. 19/oct./2011 18:36
par Le Soldat Inconnu
@MLD, GG : Merci

Donc mon second code est mieux, il suffit d'appeler une fois la procedure GadgetToolTipMultipleLine() et zou :D
Par contre, l'astuce de Gnozal valide le multiligne sur toutes les info-bulles.