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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, math, ExtCtrls, StdCtrls, Grids;
type
TMyPanel = class(TPanel)
private
FCorner : Integer;
FMaxCorner : Integer;
FStartColor:Tcolor;
FEndColor:Tcolor ;
fCaption1:String;
fCaption2:String;
fCaption3:String;
fCaption4:String;
Procedure SetCorner( Value : Integer);
Procedure SetRgn;
protected
procedure Paint;override;
public
constructor Create(AOwner: TComponent); override;
procedure SetParent( AParent : TWinControl); Override;
Procedure SetBounds( ALeft, ATop, Awidth, AHeight : Integer); override;
published
property StartColor : Tcolor read fStartColor write fStartColor ;
property EndColor : Tcolor read FEndColor write FEndColor ;
property Caption1 : String read fCaption1 write fCaption1;
property Caption2 : String read fCaption2 write fCaption2;
property Caption3 : String read fCaption3 write fCaption3;
property Caption4 : String read fCaption4 write fCaption4;
Property Corner : Integer read FCorner Write SetCorner default 10;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TMyPanel.Create;
begin
inherited;
FMaxCorner := 10;
FCorner := 10;
end;
Procedure TMyPanel.SetParent( AParent : TWinControl);
Begin
inherited;
SetRgn;
End;
Procedure TMyPanel.SetRgn;
Var
rgn : Hrgn;
// ACorner : Integer;
Begin
If Parent = Nil then exit;
rgn := CreateRoundRectRgn(0, 0, Width + 1, Height + 1, FCorner * 2, FCorner * 2);
SetWindowRgn(handle, rgn, True); {on assigne la région au handle du control fenètré}
DeleteObject(Rgn); {on supprime la région après usage}
Invalidate; {appel à peinture}
End;
Procedure TMyPanel.SetCorner( Value : Integer);
Begin
FMaxCorner := min(Height, Width) div 2; {Corner doit être inférieur
à la moitié du coté le plus petit}
FCorner := Value;
EnsureRange( 0, Fcorner, FMaxCorner);
SetRgn; {mise à jour de la région}
End;
Procedure TMyPanel.SetBounds(ALeft, ATop, Awidth, AHeight : Integer);
Var
OldHeight, OldWidth : Integer;
Begin
OldHeight := Height;
OldWidth := Width;
inherited;
If (OldWidth <> Width) or (OldHeight <> Height) then
SetCorner( Fcorner); {on vérifie que corner reste inférieur à la moitié du
coté le plus petit : on en profites pour rafraichir la région même si
Fcorner ne change pas}
end;
procedure TMyPanel.Paint;
Procedure Degrader;
Var
aBand : TRect; { Bande rectangulaire de couleur courante }
i : Integer; { Compteur pour parcourir la hauteur de la fiche }
FStartRGB : Array[0..2] of Byte; { RGB de la couleur de départ }
FCurrentRGB : Array[0..2] of Byte; { RGB de la couleur courante }
FDeltaRGB : Array[0..2] of Integer; { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
nbtranches: integer;
Canevas:TControlCanvas;
Rect:TRect;
Begin
Rect.Left := 2;
Rect.Top := 2;
Rect.Right := Self.Width-2;
Rect.Bottom := Self.Height-2;
self.ParentColor := false;
Canevas:= TControlCanvas.Create;
Canevas.Control:= self;
{ Calcul des valeurs RGB pour la couleur courante }
FStartRGB[0] := GetRValue( ColorToRGB( StartColor ) );
FStartRGB[1] := GetGValue( ColorToRGB( StartColor ) );
FStartRGB[2] := GetBValue( ColorToRGB( StartColor ) );
{ Calcul des valeurs à ajouter pour atteindre la couleur de fin }
FDeltaRGB[0] := GetRValue( ColorToRGB( EndColor )) - FStartRGB[0] ;
FDeltaRGB[1] := GetgValue( ColorToRGB( EndColor )) - FStartRGB[1] ;
FDeltaRGB[2] := GetbValue( ColorToRGB( EndColor )) - FStartRGB[2] ;
{ Initialisation des dimensions de la bande de couleur }
aBand.Left :=Rect.Left;
aBand.Right:=Rect.Right;
nbtranches:=min(256, Rect.Bottom-Rect.Top);
{ Boucle pour remplir la fiche courante en dégradé }
With Canevas Do
Begin
Pen.Style:=psSolid;
Pen.Mode:=pmCopy;
For i:= 0 To nbtranches-1 Do
Begin
{ Dimensions verticales de la bande }
aBand.Left :=Rect.Left;
aBand.Right:=Rect.Right;
aBand.Top := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*i);
aBand.Bottom := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*(i+1));
{ Calcul de la couleur courante }
FCurrentRGB[0] := (FStartRGB[0] + MulDiv( i , FDeltaRGB[0] , nbtranches )) mod 256;
FCurrentRGB[1] := (FStartRGB[1] + MulDiv( i , FDeltaRGB[1] , nbtranches )) mod 256;
FCurrentRGB[2] := (FStartRGB[2] + MulDiv( i , FDeltaRGB[2] , nbtranches )) mod 256;
{ Affichage sur la fiche }
Brush.color:=RGB(FCurrentRGB[0],FCurrentRGB[1],FCurrentRGB[2]);
FillRect(aBand);
End;
Font.Name := Self.Font.Name;
Font.Size := Self.Font.Size;
Brush.Style := bsClear;
DrawText(Canevas.Handle, PChar(self.Caption1) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
Rect.Top := Rect.Top + Self.Font.Size + 6;
Pen.Color := EndColor;
MoveTo(Rect.Left,Rect.Top);
LineTo(Rect.Right,Rect.top);
Rect.Top := Rect.Top + 2;
DrawText(Canevas.Handle, PChar(Self.Caption2) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
Rect.Top := Rect.Top + self.Font.Size + 2;
DrawText(Canevas.Handle, PChar(self.Caption3) , -1, Rect, DT_NOPREFIX or DT_SINGLELINE);
Rect.Top := Rect.Top + self.Font.Size + 2;
DrawText(Canevas.Handle, PChar(Self.Caption4) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
End;
Canevas.Free; // Libérer le canevas après usage !
End;
begin
inherited Paint;
Degrader;
end;
procedure TForm1.FormActivate(Sender: TObject);
Var
i: Integer;
Panel: TMypanel;
begin
for i := 1 To 2 do
Begin
Panel := TMyPanel.Create(Self);
Panel.Parent := Self;
with Panel do
Begin
Font.Size := 8;
Font.Name := 'Tahoma';
Name := 'PANEL' + inTtoStr(i);
Caption1 := 'PREMIER LIGNE';
Caption2 := 'DEUXIEME LIGNE';
Caption3 := 'TROISIEME LIGNE';
// Caption4 := 'QUATRIEME LIGNE';
Height := 350;
top := 100;
width := 100;
left := 200 * i;
FCorner := 10;
FMaxCorner := 10;
StartColor := clCream;
EndColor := clBlack;
end;
end;
end;
end. |
Partager