ToolTip ou info bulle

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

ToolTip ou info bulle

Message par Le Soldat Inconnu »

pour faire des ToolTip ou info bulle personnalisé avec tite, icone, retour à la ligne, couleur perso, position par rapport au gadget perso, etc...

il est pas de moi, c'est Denis qui me l'a passé

Code : Tout sélectionner

Procedure.l ToolTipCallback(Window, Message, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_NOTIFY
      *notify.NMHDR = lParam
      Select *notify\code
        Case #TTN_SHOW
          ti.TOOLINFO\cbSize = SizeOf(TOOLINFO)
          ti\hWnd = Window
          ti\uId = *notify\idfrom
          SendMessage_(*notify\hwndFrom, #TTM_GETTOOLINFO, 0, ti)
          GetWindowRect_(*notify\idfrom, area.RECT)
          GetClientRect_(*notify\hwndFrom, size.RECT)
          SystemParametersInfo_(#SPI_GETWORKAREA, 0, @ScreenSize.RECT, 0)
          GetWindowRect_(*notify\hwndFrom, ToolTipSize.RECT)
          
          Select ti\hInst
            Case 1 ; Nord
              PosX = area\left
              PosY = area\top - size\bottom - 2
            Case 2 ; Est
              PosX = area\right
              PosY = area\top
            Case 3 ; Sud
              PosX = area\left
              PosY = area\bottom
            Case 4 ; Ouest
              PosX = area\left - size\right - 2
              PosY = area\top
          EndSelect
          
          If PosX + ToolTipSize\right - ToolTipSize\left > ScreenSize\right
            PosX = ScreenSize\right - ToolTipSize\right + ToolTipSize\left - 5
          EndIf
          If PosX < ScreenSize\left
            PosX = ScreenSize\left + 5
          EndIf
          If PosY + ToolTipSize\bottom - ToolTipSize\top > ScreenSize\bottom
            PosY = ScreenSize\bottom - ToolTipSize\bottom + ToolTipSize\top - 5
          EndIf
          If PosY < ScreenSize\top
            PosY = ScreenSize\top + 5
          EndIf
          
          SetWindowPos_(*notify\hwndFrom, #HWND_TOP, PosX, PosY, 0, 0, #SWP_NOSIZE | #SWP_NOACTIVATE)
          result = 1
          
      EndSelect
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure ToolTip(Handle.l, Text$, HeaderText$, Side.l, BackColor.l, TextColor.l)
  ; handle : ID du gadget
  ; Text : texte de l'info bulle
  ; HeaderText : Titre de l'info bulle (en gras)
  ; si la fin du texte est égale à :
  ;- &1 : le titre comportera l'icone "Information"
  ;- &2 : le titre comportera l'icone "Danger"
  ;- &3 : le titre comportera l'icone "Interdiction"
  ; Side : coté du bouton sur lequel on veut placer l'info bulle
  ; BackColor : couleur du fond de l'info bulle. si color = 0, on utilise la couleur par défaut d'une info bulle
  ; TextColor : couleur du texte (0 est la couleur noire)
  
  Global ToolTipCallback.l
  
  ; on initialise le callback
  If ToolTipCallback = 0
    SetWindowCallback(@ToolTipCallback())
    ToolTipCallback = 1
  EndIf
  
  ; Mise en place des constantes
  #NORTH = 1 : #EAST = 2 : #SOUTH = 3 : #WEST = 4
  #TTS_BALLOON = $40
  #TTM_SETTITLE = #WM_USER + 32
  #TTM_TRACKACTIVATE = #WM_USER + 17
  #TTM_TRACKPOSITION = #WM_USER + 18
  #TTF_IDISHWND = $1
  #TTF_CENTERTIP = $2
  #TTF_SUBCLASS = $10
  #TTF_ABSOLUTE = $80
  #TTF_TRANSPARENT = $100
  
  If BackColor = 0 ; si la couleur est 0, on charge la couleur par défaut d'une info bulle
    BackColor = GetSysColor_(#COLOR_INFOBK)
  EndIf
  
  TT = CreateWindowEx_(0, "tooltips_class32", "", 0, 0, 0, 0, 0, 0, 0, 0, 0)
  sendMessage_(TT, 1044, TextColor, 0) ; Couleur du texte de l'info bulle
  sendMessage_(TT, 1043, BackColor, 0) ; Couleur de fond de l'info bulle
  sendMessage_(TT, 1048, 0, 300) ; Largeur maximum de l'info bulle
  If HeaderText$ <> ""
    If Left(Right(HeaderText$, 2), 1) = "&"
      Icon = Val(Right(HeaderText$, 1))
      HeaderText$ = Left(HeaderText$, Len(HeaderText$) - 2)
    Else
      Icon = 0
    EndIf
    SendMessage_(TT, #TTM_SETTITLE, Icon, HeaderText$) ; Ajoute en en-tête
  EndIf
  Button.TOOLINFO\cbSize = SizeOf(TOOLINFO)
  Button\uFlags = #TTF_IDISHWND | #TTF_SUBCLASS | #TTF_TRANSPARENT
  Button\hWnd = WindowID() ; Handle to MainWindow ( for Callback )
  Button\uId = Handle ; Handle to Gadget
  Button\hInst = Side ; misused here for the side
  Button\lpszText = @Text$
  SendMessage_(TT, #TTM_ADDTOOL, 0, Button)
EndProcedure








;- Debut du programme ---------------------------------------------------

Procedure RefreshToolTip()
  ToolTip(GadgetID(1), "Info bulle au nord du bouton" + Chr(10) + "Constante #NORTH=1", "Avec un titre", #NORTH, RGB(255, 255, 255), 0)
  ToolTip(GadgetID(2), "Info bulle à l'est du bouton" + Chr(10) + "Constante #EAST=2", "Titre + Icônes 'Danger'&2", #EAST, RGB(150, 200, 0), RGB(255, 255, 255))
  ToolTip(GadgetID(3), "Info bulle à l'ouest du bouton" + Chr(10) + "Constante #WEST=4", "Titre + Icônes 'Information'&1", #WEST, RGB(73, 177, 73), 0)
  ToolTip(GadgetID(4), "Info bulle au sud du bouton" + Chr(10) + "Constante #SOUTH=3" + Chr(10) + "Avec la couleur par défaut : Color = 0", "", #SOUTH, 0, 0)
EndProcedure


If OpenWindow(0, 0, 0, 220, 220, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "ToolTip")
  
  CreateGadgetList(WindowID())
  ButtonGadget(1, 10, 10, 100, 100, "Bouton 1")
  ButtonGadget(2, 110, 10, 100, 100, "Bouton 2")
  ButtonGadget(3, 10, 110, 100, 100, "Bouton 3")
  ButtonGadget(4, 110, 110, 100, 100, "Bouton 4")
  
  ;- Infos bulles
  RefreshToolTip()
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_EventGadget
      RefreshToolTip() ; pour rafraichir les infos bulles après l'appui sur un gadget
      Select EventGadgetID() ; boutons, zone de texte, ...
          
      EndSelect
    EndIf
  Until Event = #PB_EventCloseWindow
  
EndIf
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]