IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Dégradé de couleurs dans un TPanel


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 186
    Points : 84
    Points
    84
    Par défaut Dégradé de couleurs dans un TPanel
    Bonjour,

    Est-il possible de faire un dégradé de couleurs dans un TPanel ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    On ne peut pas accéder au canvas d'un TPanel, mais on peut superposer au TPanel un TLabel de même taille et ensuite faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      label1.caption:='';
      with label1.canvas do 
      begin ...
              maCouleur:=RGB[R,G,B]; // où R,G,B sont à calculer avec ta fonction de dégradé
              Pixels[x,y]:=maCouleur;
      end;
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Salut,

    On ne peut pas accéder au canvas d'un TPanel, mais on peut superposer au TPanel un TLabel de même taille et ensuite faire (...)
    un TLabel ?!!!
    j'aurai plutot pensé mettre une TImage ou une TPaintBox !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 186
    Points : 84
    Points
    84
    Par défaut
    J'ai trouvé un composant TJvGradientHeaderPanel dans la suite JVCL qui m'a permis de faire un très beau dégradé...
    Merci pour vos réponses

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    J'ai trouvé un composant TJvGradientHeaderPanel dans la suite JVCL qui m'a permis de faire un très beau dégradé...
    ... tant mieux.

    Voiçi quand même le code qui permet de faire un dégradé sur le canvas d'un objet-standard dont le canvas est accessible (TForm, TLabel, TImage, TBitMap ...) avec exemple d'un TLabel superposé à un TPanel pour habiller ce dernier : (code testé : marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    unit uGen;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
    
    type
      TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        RadioButton1: TRadioButton;
        RadioBtnVertical: TRadioButton;
        ColorDialog1: TColorDialog;
        GroupBox2: TGroupBox;
        plCoulDeb: TPanel;
        Label1: TLabel;
        plCoulFin: TPanel;
        Label2: TLabel;
        DegraderFiche: TButton;
        DegraderLabelSurPanel: TButton;
        Panel3: TPanel; 
        LabelSurPanel: TLabel; //< avec Align:=alClient et superposé à Panel3
        procedure DegraderFicheClick(Sender: TObject);
        procedure DegraderLabelSurPanelClick(Sender: TObject);
        procedure plCoulDebClick(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormResize(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Procedure Degrader(CanvasCible : TCanvas; Dim : TRect; CoulDeb,CoulFin : Tcolor; Vertical : boolean);
    //@param CanvasCible = Canvas cible
    //@param Dim = Rectangle-Dimensions du canvas-cible
    //@param CoulDeb,CoulFin = couleurs de début et de fin
    //@param Vertical : True pour dégradé vertical sinon dégradé horizontal.
    type      TRGB = record R,G,B : integer; end;
    var       Frange : TRect;   // Frange rectangulaire pour tracé couleur courante variable
              i     : Integer; // Compteur pour parcourir la hauteur du canvas
              cDeb  : TRGB;    // valeurs RGB de la couleur de Deb
              cDeg  : TRGB;    // valeurs RGB de la couleur courante
              eD_F  : TRGB;    // écarts de RGB entre couleurs de Deb et de Fin
    
    begin    // valeurs RGB de la couleur de Deb
             cDeb.R := GetRValue(ColorToRGB(CoulDeb));
             cDeb.G := GetGValue(ColorToRGB(CoulDeb));
             cDeb.B := GetBValue(ColorToRGB(CoulDeb));
             // écarts RGB entre couleurs de Deb et de Fin
             eD_F.R := GetRValue(ColorToRGB(CoulFin )) - cDeb.R;
             eD_F.G := GetgValue(ColorToRGB(CoulFin )) - cDeb.G;
             eD_F.B := GetbValue(ColorToRGB(CoulFin )) - cDeb.B;
             // Initialisation des dimensions de la Frange de couleur
             Frange.Left := Dim.Left;
             Frange.Right:= Dim.Right - Dim.Left;
             // Boucle de remplissage en dégradé du canvas
             with CanvasCible do
             begin for i:= 0 to 255 do
                   begin // Dimensions de la Frange
                         if Vertical = true then
                         begin Frange.Left := Dim.Left;
                               Frange.Right:= Dim.Right - Dim.Left;
                               Frange.Top  := MulDiv(i, Dim.Bottom - Dim.top, 256);
                               Frange.Bottom := MulDiv(i+1, Dim.Bottom - Dim.top, 256);
                         end else
                         begin Frange.Top:=Dim.top;
                               Frange.Bottom:= Dim.Bottom - Dim.top;
                               Frange.left  := MulDiv(i, Dim.Right - Dim.Left, 256);
                               Frange.right := MulDiv(i+1 , Dim.Right - Dim.Left, 256);
                         end;
                         // couleur courante dégradée
                         cDeg.R := (cDeb.R + MulDiv(i, eD_F.R, 255)) mod 256;
                         cDeg.G := (cDeb.G + MulDiv(i, eD_F.G, 255)) mod 256;
                         cDeg.B := (cDeb.B + MulDiv(i, eD_F.B, 255)) mod 256;
                         // Tracé sur canvas
                         Brush.color:=RGB(cDeg.R, cDeg.G, cDeg.B);
                         FillRect(Frange);
                   end;
             end;
    end;
    
    //--------------------------------------------------------------------------------
    
    
    procedure TForm1.DegraderFicheClick(Sender: TObject);
    begin     Degrader(Form1.canvas, Rect(0,0,width,height), plCoulDeb.Color, plCoulFin.Color, RadioBtnVertical.Checked);
    end;
    
    procedure TForm1.plCoulDebClick(Sender: TObject);
    //            Choix des couleurs de début et de fin du dégradé 
    begin     ColorDialog1.Color:=(sender as Tpanel).Color;
              if ColorDialog1.Execute
              then (sender as Tpanel).Color:=ColorDialog1.Color;
    end;
    
    procedure TForm1.FormShow(Sender: TObject);
    begin     DegraderFiche.Click;
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    begin     DegraderFiche.Click;
    end;
    
    procedure TForm1.DegraderLabelSurPanelClick(Sender: TObject);
    var       R : TRect;
    begin     with LabelSurPanel do
              begin R:=Rect(0,0,width,height);
                    Degrader(canvas, R, plCoulDeb.Color, plCoulFin.Color, RadioBtnVertical.Checked);
              end;
    end;
    
    end.
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 748
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 748
    Points : 15 169
    Points
    15 169
    Par défaut
    Bonjour,
    Citation Envoyé par Gilbert Geyer Voir le message
    Voici quand même le code qui permet de faire un dégradé sur le canvas d'un objet-standard dont le canvas est accessible (TForm, TLabel, TImage, TBitMap ...) avec exemple d'un TLabel superposé à un TPanel pour habiller ce dernier : (code testé : marche) :
    8 ans plus tard , je reviens sur le code proposé par Gilbert car, pour des besoins propres il me fallait un afficheur (le label) plus petit que son conteneur (le panel), et je me suis rendu compte qu'il y avait des petits soucis, masqués quand Top = 0 et Bottom = Height...

    De modifications en simplifications, je suis arrivé au code ci-dessous, qui remplace le code existant dans la procédure "Degrader" à partir de la ligne " // Initialisation des dimensions de la Frange de couleur" jusqu'à la fin de la proc (que j'ai renommée "MakeGradient") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
             // Initialisation des dimensions de la Frange de couleur
             with Frange do // Dimensions de la Frange
             if Vertical then
             begin // le Top est calculé + bas
               Left  := Dim.Left;
               Right := Dim.Right;
               Bottom:= Dim.Bottom;
             end else
             begin // le Left est calculé + bas
               Top   := Dim.top;
               Bottom:= Dim.Bottom;
               Right := Dim.Right;
             end;
     
             // Boucle de remplissage en dégradé du canvas
             for i:= 0 to 255 do
             begin
               with Frange do // Top ou Left de la Frange
               if Vertical then
                 Top  := MulDiv(i, Dim.Bottom - Dim.top, 256) + Dim.Top
               else
                 Left := MulDiv(i, Dim.Right - Dim.Left, 256) + Dim.Left;
     
                 // couleur courante dégradée
                 cDeg.R := (cDeb.R + MulDiv(i, eD_F.R, 255)) mod 256;
                 cDeg.G := (cDeb.G + MulDiv(i, eD_F.G, 255)) mod 256;
                 cDeg.B := (cDeb.B + MulDiv(i, eD_F.B, 255)) mod 256;
     
                 // Tracé sur canvas
                 with CanvasCible do begin
                   Brush.color:=RGB(cDeg.R, cDeg.G, cDeg.B);
                   FillRect(Frange);
               end;
             end;
    J'ai fait un test rapide comme ceci, avec un label sur un panel et un Checkbox qui porte le nom RadioBtnVertical, si si ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.RadioBtnVerticalClick(Sender: TObject);
    var
      R: TRect;
    begin
      with LabelSurPanel do
      begin
    //    R:=Rect(0,0,width,height);
        // TODO : s'assurer que Left < Right et Top < Bottom
        // sinon l'affichage ne sera pas bon...
        R:=Rect(20, 15, width div 3, height div 2);
        MakeGradient(canvas, R, clBlack, clWhite, RadioBtnVertical.Checked);
      end;
    end;
    Ça permet d'obtenir ce genre de résultats :
    Nom : dégradés4dvlp.jpg
Affichages : 1554
Taille : 16,3 Ko
    Pour les 4 images à gauche, il s'agit de TImage (noms : image1 à 4, width et height à 128) utilisés comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    procedure TForm1.FormActivate(Sender: TObject);
    var
      i: integer;
      R: TRect;
    begin
      R := image1.ClientRect;
    //  R.Top := R.Bottom div 2;
      R.Left:= R.Right  div 2;
      R.Top := R.Bottom div 3;
    //  R.Left:= R.Right  div 3;
      for i := 1 to 4 do
      case i of
        1: MakeGradient(image1.Canvas, R, clBlack, clWhite, False); // H
        2: MakeGradient(image2.Canvas, R, clGreen, clBlue,  False); // H
        3: MakeGradient(image3.Canvas, R, clWhite, clBlack, True);  // V
        4: MakeGradient(image4.Canvas, R, clAqua,  clOlive, True);  // V
      end;
    end;
    Merci pour avoir publié il y a 8 ans cette chose qui m'a aujourd'hui mis le pied à l'étrier,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/10/2010, 16h10
  2. [Flex4] dégradé de couleur dans une ProgessBar
    Par npirard dans le forum Flex
    Réponses: 0
    Dernier message: 23/07/2010, 09h08
  3. Réponses: 2
    Dernier message: 28/05/2009, 09h48
  4. Mettre un dégradé ou couleur dans un jPanel
    Par Telemak dans le forum 2D
    Réponses: 16
    Dernier message: 14/04/2009, 21h26
  5. Dégradé de couleur dans un rectangle
    Par macoute dans le forum 2D
    Réponses: 3
    Dernier message: 10/01/2006, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo