Page 1 sur 1

[Ex] Barre de progression en dégradé

Posté : mer. 19 sept. 2018 21: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.