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

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

Commente ProcedureReturn #PB_ProcessPureBasicEvents et teste à nouveau.
Joli plantage hein ?
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