Basic Univers
; Author : Denis
; Date :  06/05/07
; Description : Dégradé linéaire


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