Couleur de fond pour "TrackBarGadget"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Couleur de fond pour "TrackBarGadget"

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Couleur de fond pour "TrackBarGadget"

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Re: Couleur de fond pour "TrackBarGadget"

Message par Aliass »

Super, c'est exactement ce que je cherche comme résultat.
Je vais étudier le code...

Merci
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Re: Couleur de fond pour "TrackBarGadget"

Message 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
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: Couleur de fond pour "TrackBarGadget"

Message 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.
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Couleur de fond pour "TrackBarGadget"

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Couleur de fond pour "TrackBarGadget"

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: Couleur de fond pour "TrackBarGadget"

Message par Mindphazer »

@Falsam : joli, très joli cours sur le callback ! ;-)
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Aliass
Messages : 23
Inscription : lun. 17/sept./2012 8:09

Re: Couleur de fond pour "TrackBarGadget"

Message 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
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Couleur de fond pour "TrackBarGadget"

Message 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:
Répondre