Page 1 sur 1

Couleur de fond pour "TrackBarGadget"

Publié : mar. 26/mars/2013 13:24
par Aliass
Bonjour à tous,

L'utilisation du gadget "TrackBarGadget" sur une fenêtre dont le couleur de fond n'est pas #D4D0C8 affiche un pavé gris sous le gadget de la taille définie lors de l'appel du gadget.
Est il possible de changer la couleur de fond de ce gadget ?
J'ai remarqué le même problème avec les boutons bande de 1px autour de la forme)

Merci pour toute suggestion

Aliass

Re: Couleur de fond pour "TrackBarGadget"

Publié : mar. 26/mars/2013 13:41
par falsam
Sous windows uniquement (Code de Sparkie forum anglais)

Code : Tout sélectionner

Procedure WinCallback(hwnd, msg, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select msg 
    Case #WM_CTLCOLORSTATIC 
      result = GetGadgetData(1)
  EndSelect  
  ProcedureReturn result 
EndProcedure 

If OpenWindow(0, 0, 0, 320, 240, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
  SetWindowColor(0, #Red)
  TrackBarGadget(1, 10, 10, 300, 30, 0, 25, #PB_TrackBar_Ticks) 
  winColor = GetWindowColor(0)
  If winColor <> -1
    hBrush = CreateSolidBrush_(winColor)
    If hBrush
      SetGadgetData(1, hBrush)
      SetWindowCallback(@WinCallback()) 
    EndIf
  EndIf
  Repeat
    event = WaitWindowEvent()
    
  Until event = #PB_Event_CloseWindow
  If hBrush
    DeleteObject_(hBrush)
  EndIf
EndIf

Re: Couleur de fond pour "TrackBarGadget"

Publié : mar. 26/mars/2013 16:06
par Aliass
Super, c'est exactement ce que je cherche comme résultat.
Je vais étudier le code...

Merci

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 8:28
par Aliass
Bon alors là je comprends pas comment ça marche :(

Plusieurs questions me viennent à l'esprit.
- D’où sort cette fonction CreateSolidBrush_() ? (J'ai cherché dans la doc et j'ai rien trouvé).
- Pourquoi un GetGadgetData() effectue le changement de la couleur et pourquoi, pour que cela fonctionne, doit il être effectué dans une fonction "CallBack" ?
- Comment faire pour passer un paramètre à la fonction CallBack ? (Plusieurs objets dont il faut modifier la couleur de fond).

Bref, merci Falsam pour tes lumières mais actuellement j'ai le phare dans les yeux et je n'y vois rien... 8O

Aliass

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 8:57
par Mindphazer
Aliass a écrit : - D’où sort cette fonction CreateSolidBrush_() ? (J'ai cherché dans la doc et j'ai rien trouvé).
Aliass
CreateSolidBrush_() est une API, c'est à dire une fonction spécifique du système d'exploitation (Windows en l'occurrence). C'est la raison pour laquelle ce code ne marche que sous Windows.
De manière générale, toutes les fonctions se terminant par "_" sont des appels à des API, ce ne sont donc pas des fonctions de PureBasic.

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 10:42
par Ar-S
Si c'est pour du non cross platform, je t'invite aussi à regarder du coté du PureColor() Une lib de Gnozal.
Voir sur son site.

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 13:12
par falsam
Aliass a écrit :D’où sort cette fonction CreateSolidBrush_() ? (J'ai cherché dans la doc et j'ai rien trouvé).
La réponse est donné par Mindphaser quelques réponses avant la mienne : C'est une api Microsoft. La documentation se trouve sur les différents sites de microsoft comme ce lien par exemple http://msdn.microsoft.com/fr-fr/library ... csy47.aspx
Aliass a écrit :Pourquoi un GetGadgetData() effectue le changement de la couleur et pourquoi, pour que cela fonctionne, doit il être effectué dans une fonction "CallBack" ?
Une procedure Callback est une procedure de rappel (of course) qui sera automatiquement appelée par le système quand certains évènements se produiront sur une fenêtre.

La communication entre une fenêtre et le système se fait par l'intermédiaire de messages.

En purebasic, la fenêtre envoie des messages évènementiels à la procédure de callback (avec la fonction SetWindowCallback ), seuls les 4 paramètres à savoir hwnd, message, wParam et lParam sont passés.

La procédure de callback étant chargée de traiter tous les messages reçus, son corps ressemble donc la plupart du temps à ceci :

Code : Tout sélectionner

Procedure WindoWCallBack(WindowId, msg, wParam, lParam)
  Debug "Je passe par le callback"
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Utilisation d'un callback",#PB_Window_SystemMenu) 
    
    SetWindowCallback(@WindowCallback())    ; active la callback
    
    Repeat 
      Select WaitWindowEvent() 
        Case #PB_Event_CloseWindow 
          End 
      EndSelect 
    ForEver 
    
EndIf 
:idea: Teste ce petit code en passant la souris sur ta fenetre par exemple.

ATTENTION : Une procédure de callback va te permettre de traiter les messages dont tu as l'utilité. Les autres messages ne doivent jamais être ignorés. Ces messages seront alors renvoyer à la boucle évenementielle de ton programme. C'est le rôle de la fonction ProcedureReturn #PB_ProcessPureBasicEvents.

Ci dessous un autre code tout droit sorti de l'aide que tu peux tester.

Code : Tout sélectionner

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
    ; Nous pouvons tester dans la callback les paramètres renseignés automatiquement par windows
    
    If uMsg = #WM_SIZE 
      Select wParam 
        Case #SIZE_MINIMIZED 
          Debug "La fenêtre est minimisée" 
        Case #SIZE_RESTORED 
          Debug "La fenêtre est rétablie" 
        Case #SIZE_MAXIMIZED 
          Debug "La fenêtre est agrandie" 
      EndSelect 
    EndIf 
  
    ProcedureReturn #PB_ProcessPureBasicEvents 
  EndProcedure 
  
  
  If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 
    
    SetWindowCallback(@WinCallback())    ; active la callback
    
    Repeat 
      Select WaitWindowEvent() 
        Case #PB_Event_CloseWindow 
          End 
      EndSelect 
    ForEver 
    
  EndIf 
:idea: Commente ProcedureReturn #PB_ProcessPureBasicEvents et teste à nouveau.
Joli plantage hein ? :mrgreen:
Aliass a écrit :Comment faire pour passer un paramètre à la fonction CallBack ? (Plusieurs objets dont il faut modifier la couleur de fond).

Code : Tout sélectionner

Global WindowColor.l, BrushWindowColor.l, BrushEditBackColor.l, BrushEditFocusBackColor.l

Procedure WinCallback(WindowId, msg, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 

  Select msg 
    Case #WM_CTLCOLORSTATIC
      Select lparam
        Case GadgetID(1),GadgetID(2), GadgetID(6), GadgetID(7)
          result = BrushWindowColor
      EndSelect
      
      
    Case   #WM_CTLCOLOREDIT
      Select lparam
        Case GadgetID(4), GadgetID(5)
          If GetFocus_()=lParam
            SetBkMode_(wParam, #TRANSPARENT)
            SetTextColor_(wParam, $000000)
            Result = BrushEditFocusBackColor
          
          Else
        
            SetBkMode_(wParam, #TRANSPARENT)
            SetTextColor_(wParam, $000000)
            Result = BrushEditBackColor
        
          EndIf
      EndSelect
                  
  EndSelect  
  
  ProcedureReturn result 
EndProcedure 


If OpenWindow(0, 0, 0, 640, 400, "Colorier des gadgets", #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
  SetWindowColor(0, RGB(221, 240, 182))
  
  LoadFont(Police, "Tahoma", 10)
  SetGadgetFont(#PB_Default, FontID(Police))
  
  WindowColor = GetWindowColor(0)
  
  TrackBarGadget(1, 10, 10, 300, 30, 0, 25, #PB_TrackBar_Ticks) 
  Frame3DGadget(2, 10, 50, 400, 200, "Frame3DGadget")
  
  TextGadget(3, 20, 70, 80, 20, "TextGadget")
  SetGadgetColor(3,#PB_Gadget_BackColor, WindowColor)
                 
  StringGadget(4, 150, 70, 200, 22, "StringGadget")
  StringGadget(5, 150, 100, 200, 22, "StringGadget")
  CheckBoxGadget(6, 20, 130,200, 22, "CheckBoxGadget")
  OptionGadget(7, 20, 160, 200, 22, "OptionGadget")
    
  ListIconGadget(9, 420, 50, 200, 200, "Col1", 100)
  SetGadgetColor(9,#PB_Gadget_BackColor, RGB(180, 199, 141))
  
  ;CreateSolidBrush (API Microsoft)
  ;Initialise un pinceau avec une couleur unie spécifiée.
  ;http://msdn.microsoft.com/fr-fr/library/vstudio/1tycsy47.aspx
  BrushWindowColor = CreateSolidBrush_(WindowColor)
  BrushEditFocusBackColor = CreateSolidBrush_(RGB(223, 227, 46))
  BrushEditBackColor = CreateSolidBrush_(RGB(180, 199, 141))
  
  SetWindowCallback(@WinCallback())  
  
  Repeat
    event = WaitWindowEvent()
  
  Until event = #PB_Event_CloseWindow
  
  DeleteObject_(BrushWindowColor)
  DeleteObject_(BrushEditFocusBackColor)
  DeleteObject_(BrushEditBackColor)
EndIf

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 13:20
par Mindphazer
@Falsam : joli, très joli cours sur le callback ! ;-)

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 13:52
par Aliass
Une nouvelle fois, MERCI falsam pour toutes ces explications. :D

Je vais étudier toutes ces informations et le code fourni en exemple afin de bien comprendre la "mécanique" de tout ça.

Aliass

Re: Couleur de fond pour "TrackBarGadget"

Publié : mer. 27/mars/2013 14:25
par MLD
@falsam
+1 Ton cours sur le calbar,heu! je voulais dire Callback servira j'en suis sur a beaucoup de monde. :lol: :lol: