Dégradé linéaire
Publié : dim. 06/mai/2007 20:50
Voici un code qui pourra servir, on met un dégradé linéaire en couleur de fond d'une fenêtre, le dégradé est défini par une couleur de départ et la couleur d'arrivée, pour l'exemple c'est dans la callback, l'élément vert(0) du tableau est la couleur de départ et vert(1) la couleur d'arrivée, X et Y définissent le point de départ et le point d'arrivé du rectangle à remplir. Je ne rempli qu'à partir de la position Y = 100, ce qui est avant est mis en blanc avec SetWindowColor().
reportez-vous à la doc MS pour l'API GradientFill.
Dans l'exemple, au départ le dernier paramètre vaut #GRADIENT_FILL_RECT_V, le dégradé est vertical, si vous mettez #GRADIENT_FILL_RECT_H, il sera horizontal, c'est ce que fait le bouton, alternativement horizontal/vertical
reportez-vous à la doc MS pour l'API GradientFill.
Dans l'exemple, au départ le dernier paramètre vaut #GRADIENT_FILL_RECT_V, le dégradé est vertical, si vous mettez #GRADIENT_FILL_RECT_H, il sera horizontal, c'est ce que fait le bouton, alternativement horizontal/vertical
Code : Tout sélectionner
EnableExplicit
Enumeration
; fenêtre
#Fenetre
; gadget
#Frame3DGadget = 0
#bouton
EndEnumeration
#WindowTitle = "Dégradé linéaire"
Global FenetreID.l ; WindowID(#Fenetre)
Global Largeur_Fenetre.l ; largeur de la fenêtre #Fenetre
Global Hauteur_Fenetre.l ; hauteur de la fenêtre #Fenetre
Global hauteur_FenetreBlanche.l = 100 ; Hauteur de la fenêtre blanche
Global OldProc.l ; l'adresse de la procedure callback de windows
Global WindowEvent.l ; mémorise l'événement
Global sens = #GRADIENT_FILL_RECT_V ; sens du dégradé
; Import-File created by Lib2PBImport
; Libname: msimg32.lib
; created: 2007/05/06 18:19
Import "msimg32.lib"
GradientFill(a.l, b.l, c.l, d.l, e.l, f.l) As "_GradientFill@24"
EndImport
Procedure myCallback(window, message, wParam, lParam)
Protected dc.l, ps.PAINTSTRUCT, lpRect.RECT
Protected Dim vert.TRIVERTEX(1)
Protected gRect.GRADIENT_RECT
Select message
Case #WM_PAINT
dc = BeginPaint_(window, @ps)
If dc
If GetClientRect_(window, @lpRect)
vert(0)\x = 0
vert(0)\y = hauteur_FenetreBlanche
vert(0)\Red = $2B00
vert(0)\Green = $3900
vert(0)\Blue = $4400
vert(0)\Alpha = $FF00
vert(1)\x = lpRect\right
vert(1)\y = lpRect\bottom
vert(1)\Red = $9F00
vert(1)\Green = $D200
vert(1)\Blue = $FA00
vert(1)\Alpha = $FF00
gRect\UpperLeft = 0
gRect\LowerRight = 1
GradientFill(dc, @vert(), 2, @gRect, 1, sens)
EndIf
EndPaint_(window, @ps)
ProcedureReturn 0
EndIf
EndSelect
ProcedureReturn CallWindowProc_(OldProc, window, message, wParam, lParam)
EndProcedure
Largeur_Fenetre = 600
Hauteur_Fenetre = Largeur_Fenetre / 1.618033988
If OpenWindow(#Fenetre, 0, 0, Largeur_Fenetre, Hauteur_Fenetre, #WindowTitle, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
SetWindowColor(#Fenetre, #White)
; initialisation variables
FenetreID = WindowID(#Fenetre)
If CreateGadgetList(FenetreID)
Frame3DGadget(#Frame3DGadget, 0, hauteur_FenetreBlanche, WindowWidth(#Fenetre), 1, "", #PB_Frame3D_Flat)
ButtonGadget(#bouton, 40, 320, 100, 30, "Sens du dégradé")
HideWindow(#Fenetre, 0)
OldProc = SetWindowLong_(WindowID(#Fenetre), #GWL_WNDPROC, @myCallback())
Repeat
WindowEvent = WaitWindowEvent()
Select WindowEvent
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If sens = #GRADIENT_FILL_RECT_V
sens = #GRADIENT_FILL_RECT_H
Else
sens = #GRADIENT_FILL_RECT_V
EndIf
RedrawWindow_(WindowID(#Fenetre), 0, 0, #RDW_INVALIDATE)
EndSelect
ForEver
EndIf
EndIf
End