Page 1 sur 1

[Ex] Barre de progression en dégradé

Posté : mer. 19 sept. 2018 22:10
par toto1515
Bonjour,
voici un exemple de barre de progression en dégradé.
J'ai mis pas mal de temps pour trouver comment faire aussi je mets un exemple de ce que j'ai créé.
#cs ----------------------------------------------------------------------------
   AutoIt Version: 3.3.14.2
   Author:         Toto1515
   Script Function: exemple de barre de progression avec des dégradés
#ce ----------------------------------------------------------------------------
OnAutoItExitRegister("quitter")

#Region les includes
   #include <GdiPlus.au3>
#EndRegion les includes

#Region les options
   Opt("GUIOnEventMode", 1)
   Opt("mustdeclarevars", 1)
#EndRegion les options

#Region les constantes
   Global Const $GUI_EVENT_CLOSE = -3
   Global Const $WS_EX_STATICEDGE = 0x00020000
   Global Const $color_0 = 0xFFFFFF
   Global Const $prog_left2 = 10 ; position gauche de la barre de progression
   Global Const $prog_top2 = 15 ; hauteur de la barre de progression
   Global Const $prog_height2 = 10 ; Position verticale de la barre de progression
   Global Const $nb_blancs = 51
#EndRegion les constantes

#Region variables
   Global $maxprogress = 500
   Global $my_colors, $nbbar
   Global $tableau[1]
   Global $nbtot = 0
   Global $Form1, $btn_start, $btn_quitter, $Status_Label
   Global $coef
   Global $max_progress = 0
   Global $progress[1][5]
   Global $lacoulnum, $lacoul
   Global $hGraphic_G
#EndRegion variables

#Region programme principal
   #Region création de la forme
      $Form1 = GUICreate(StringFormat("%" & $nb_blancs & "s", " ") & _
            "Barres de progression en dégradé" & _
            StringFormat("%" & $nb_blancs & "s", " "), 526, 94, -1, 100, 0)
      GUISetOnEvent($GUI_EVENT_CLOSE, "quitter")
      $btn_start = GUICtrlCreateButton("Démarrer", 100, 40, 70, 20)
      GUICtrlSetOnEvent($btn_start, "OKButton")
      $btn_quitter = GUICtrlCreateButton("Quitter", 200, 40, 70, 20)
      GUICtrlSetOnEvent($btn_quitter, "quitter")
      GUICtrlSetState($btn_quitter, 32)
      $Status_Label = GUICtrlCreateLabel("", 400, 42, 100, 20)
   #EndRegion création de la forme

   ; on établi la liste des couleurs
   $my_colors = listecoul(10, 240)

   ; on défini alatoirement le nombre de barres
   $nbbar = Random(5, 20, 1)

   ; on redimensionne les tableaux
   ReDim $tableau[$nbbar + 1]
   ReDim $progress[$nbbar + 1][5]

   For $i = 1 To $nbbar
      $tableau[$i] = Random(50, 230, 1) ; largeur initiele de la barre
   Next

   ;on calcule la somme des largeurs des barres
   For $i = 1 To $nbbar;UBound($tableau) - 1
      $nbtot += $tableau[$i]
   Next

   ;on calcule le coefficient pour ramener la taille totele à $maxprogress=500
   $coef = $nbtot / $maxprogress

   For $i = 1 To $nbbar
      ;on applique le coef à la largeur de chaque barre et on arrondi
      $progress[$i][1] = Round($tableau[$i] / $coef)
      ; on recalcule la somme des largeurs des barres
      $max_progress += $progress[$i][1]
      ; on élabore le numéro de la couleur en fonction du nombre de barre
      $lacoulnum = Int(1 + ($i - 1) * ($my_colors[0][0] - 1) / ($nbbar - 1))
      ; on défini la couleur de la barre
      $lacoul = "0x" & Hex($my_colors[$lacoulnum][1], 2) & Hex($my_colors[$lacoulnum][2], 2) & Hex($my_colors[$lacoulnum][3], 2)
      $progress[$i][2] = $lacoul
      ; on calcule la position gauche de la barre
      $progress[$i][3] = $progress[$i - 1][1] + $progress[$i - 1][3]
   Next
   $progress[0][0] = $max_progress

   ; création du cadre de la barre de progression
   GUICtrlCreateLabel("", $prog_left2 - 1, $prog_top2 - 1, $max_progress + 2, $prog_height2 + 2, -1, $WS_EX_STATICEDGE)

   ;on crée les graphiques pour les barres
   _GDIPlus_Startup()
   $hGraphic_G = _GDIPlus_GraphicsCreateFromHWND($Form1)
   For $i = 1 To $nbbar
      _CreateGradient($color_0, $progress[$i][2], 0, 0, $progress[$i][1], $prog_height2, $i)
   Next

   ;on affihce la forme
   GUISetState(@SW_SHOW, $Form1)

   ;on dessine les barres
   For $i = 1 To $nbbar
      _GDIPlus_GraphicsDrawImageRectRect($hGraphic_G, $progress[$i][0], 0, 0, $progress[$i][1], $prog_height2, $progress[$i][3] + $prog_left2, $prog_top2, $progress[$i][1], $prog_height2)
   Next

   ; on boucle
   While 1
      Sleep(100)
   WEnd
#EndRegion programme principal

#Region les fonctions
   Func _CreateGradient($nStartColor, $nEndColor, $nX, $nY, $nWidth, $nHeight, $num)
      Local $i_deb = 1
      Local $i_fin = $prog_height2
      ;on décompose les couleurs
      Local $color1R = BitAND(BitShift($nStartColor, 16), 0xFF);_ColorGetRed($nStartColor)
      Local $color1G = BitAND(BitShift($nStartColor, 8), 0xFF);_ColorGetGreen($nStartColor)
      Local $color1B = BitAND($nStartColor, 0xFF);_ColorGetBlue($nStartColor)
      Local $color2R = BitAND(BitShift($nEndColor, 16), 0xFF);_ColorGetRed($nStartColor)
      Local $color2G = BitAND(BitShift($nEndColor, 8), 0xFF);_ColorGetGreen($nStartColor)
      Local $color2B = BitAND($nEndColor, 0xFF);_ColorGetBlue($nStartColor)

      ; on calcule le pas
      Local $nStepR = ($color2R - $color1R) / ($nHeight - $nY)
      Local $nStepG = ($color2G - $color1G) / ($nHeight - $nY)
      Local $nStepB = ($color2B - $color1B) / ($nHeight - $nY)

      ; on défini le dessin
      $progress[$num][0] = _GDIPlus_BitmapCreateFromGraphics($progress[$num][1], $prog_height2, $hGraphic_G)
      Local $hGraphic_1 = _GDIPlus_ImageGetGraphicsContext($progress[$num][0])
      Local $hPen1 = _GDIPlus_PenCreate(0, 1)

      ; on crée le dégradé de haut en bas
      For $i = $i_deb To $i_fin
         Local $PenColor = "0xFF" & StringFormat("%02X%02X%02X", $color1R + $nStepR * $i, $color1G + $nStepG * $i, $color1B + $nStepB * $i)
         _GDIPlus_PenSetColor($hPen1, $PenColor)
         _GDIPlus_GraphicsDrawLine($hGraphic_1, 0, $i - $i_deb, $progress[$num][1], $i - $i_deb, $hPen1)
      Next

      ; on libère les éléments
      _GDIPlus_PenDispose($hPen1)
      _GDIPlus_GraphicsDispose($hGraphic_1)

      ; on défini le dessin
      $progress[$num][4] = _GDIPlus_BitmapCreateFromGraphics($progress[$num][1], $prog_height2, $hGraphic_G)
      $hGraphic_1 = _GDIPlus_ImageGetGraphicsContext($progress[$num][4])
      $hPen1 = _GDIPlus_PenCreate(0, 1)

      ; on crée le dégradé de bas en haut
      For $i = $i_deb To $i_fin
         $PenColor = "0xFF" & StringFormat("%02X%02X%02X", $color1R + $nStepR * $i, $color1G + $nStepG * $i, $color1B + $nStepB * $i)
         _GDIPlus_PenSetColor($hPen1, $PenColor)
         _GDIPlus_GraphicsDrawLine($hGraphic_1, 0, $i_fin - $i, $progress[$num][1], $i_fin - $i, $hPen1)
      Next

      ; on libère les éléments
      _GDIPlus_PenDispose($hPen1)
      _GDIPlus_GraphicsDispose($hGraphic_1)
   EndFunc   ;==>_CreateGradient

   Func listecoul($valbas, $valhaut)
      Local $les_couleurs[1531][4]
      Local $t = 0
      For $i = $valbas To $valhaut
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $valhaut
         $les_couleurs[$t][2] = $i
         $les_couleurs[$t][3] = $valbas
      Next
      For $i = $valhaut - 1 To $valbas Step -1
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $i
         $les_couleurs[$t][2] = $valhaut
         $les_couleurs[$t][3] = $valbas
      Next
      For $i = $valbas + 1 To $valhaut
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $valbas
         $les_couleurs[$t][2] = $valhaut
         $les_couleurs[$t][3] = $i
      Next
      For $i = $valhaut - 1 To $valbas Step -1
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $valbas
         $les_couleurs[$t][2] = $i
         $les_couleurs[$t][3] = $valhaut
      Next
      For $i = $valbas + 1 To $valhaut
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $i
         $les_couleurs[$t][2] = $valbas
         $les_couleurs[$t][3] = $valhaut
      Next
      For $i = $valhaut - 1 To $valbas + 1 Step -1
         $t += 1
         $les_couleurs[$t][0] = $t
         $les_couleurs[$t][1] = $valhaut
         $les_couleurs[$t][2] = $valbas
         $les_couleurs[$t][3] = $i
      Next
      $les_couleurs[0][0] = $t
      Return $les_couleurs
   EndFunc   ;==>listecoul

   Func quitter()
      For $i = 1 To UBound($progress) - 1
         _GDIPlus_ImageDispose($progress[$i][0])
      Next
      _GDIPlus_GraphicsDispose($hGraphic_G)
      _GDIPlus_Shutdown()
      Exit
   EndFunc   ;==>quitter

   Func OKButton()
      GUICtrlSetState($btn_quitter, 32)
      GUICtrlSetState($btn_start, 32)
      Local $le_pas = 1
      ; on redessine les barres avec les dégradés initiaux
      For $i = 1 To $nbbar
         _GDIPlus_GraphicsDrawImageRectRect($hGraphic_G, $progress[$i][0], 0, 0, $progress[$i][1], $prog_height2, $progress[$i][3] + $prog_left2, $prog_top2, $progress[$i][1], $prog_height2)
      Next
      Local $percent = 0
      ; on incrémente les barres
      For $t = 1 To $nbbar
         If $t <> 1 Then Sleep(1000)
         ; on dessine progressivement les nouveaux dégradés
         For $i = $le_pas To $progress[0][0] Step $le_pas
            $percent = $percent + $le_pas
            If $i > $progress[$t][1] Then $i = $progress[$t][1]
            GUICtrlSetData($Status_Label, "Avancement : " & Round(100 * $percent / $maxprogress) & "%")
            _GDIPlus_GraphicsDrawImageRectRect($hGraphic_G, $progress[$t][4], 0, 0, $progress[$t][1], $prog_height2, $progress[$t][3] + $prog_left2, $prog_top2, $i, $prog_height2)
            Sleep(10)
            If $i = $progress[$t][1] Then ExitLoop
         Next

      Next
      GUICtrlSetState($btn_quitter, 16)
      GUICtrlSetState($btn_start, 16)
   EndFunc   ;==>OKButton

#EndRegion les fonctions
 
Si ça peut être utile à quelqu'un ...

Les remarques sont les bienvenues..

Toto1515 :D

Re: [Ex] Barre de progression en dégradé

Posté : lun. 10 déc. 2018 10:26
par Westcb28
Script bien sympa que je vais essayer de réutiliser pour une copie de fichier un peu longue au démarrage de mon programme.