Bonjour à tous,
Je suis sous Delphi 4 standard.
En mode graphique ai-je la possibilité de tracer une ligne dont la couleur passe progressivement du bleu clair à une extrémité au bleu foncé à l’autre extrémité ?
Merci à ceux qui pourront m’aider.
Bonjour à tous,
Je suis sous Delphi 4 standard.
En mode graphique ai-je la possibilité de tracer une ligne dont la couleur passe progressivement du bleu clair à une extrémité au bleu foncé à l’autre extrémité ?
Merci à ceux qui pourront m’aider.
Bonjour,
Voici une fonction qui renvoie la couleur interpolée dite "dégradée" entre la couleur de gauche et de droite en fonction de la valeur de l'indice i compris entre 0 et DeltaI :
Exemple d'utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 function Degrade( i, DeltaI : integer; clGauche,clDroite : tColor) : tColor; var cdep, cfin : integer; Rdep, Gdep, Bdep, Rfin, Gfin, Bfin : byte; pr, pg, pb : real; begin cdep := clGauche; cfin := clDroite; Rdep := getRvalue(cdep); Gdep := getGvalue(cdep); Bdep := getBvalue(cdep); Rfin := getRvalue(cfin); Gfin := getGvalue(cfin); Bfin := getBvalue(cfin); if DeltaI=0 then DeltaI:=1; pr := (Rfin-Rdep)/DeltaI; pg := (Gfin-Gdep)/DeltaI; pb := (Bfin-Bdep)/DeltaI; Result:=rgb(Rdep+round(i*pr), Gdep+round(i*pg), Bdep+round(i*pb)); end;
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 procedure TForm1.SpeedButton1Click(Sender: TObject); var i,DeltaI,clVariable,x,y,xo,yo : integer; bmp : tBitMap; begin bmp := tBitMap.create; bmp.width:=256; bmp.height:=256; with bmp.canvas do begin xo:=10; yo:=21; moveTo(xo,yo); DeltaI:=100; for i:=1 to DeltaI do begin clvariable:=Degrade( i, DeltaI,clYellow,clNavy); //<- Teinte dégradée entre clYellow et clNavy pen.color:=clVariable; pen.style:=psSolid; lineTo(xo+i,yo+i); end; end; image1.Picture.bitmap.Assign(bmp); bmp.free; end;
EDIT : remplacer clYellow par clAqua par exemple.
Une autre approche (ébauche à améliorer) en utilisant la fonction GradientFill sur une région:
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 procedure TForm1.DrawGradientLine(const aCanvas :TCanvas; const X1, Y1, X2, Y2 :integer; const aStartColor, aEndColor :TColor; aPenSize :integer = 1); var GradVert :array[0..1] of TRIVERTEX; RgnVerts :array[0..3] of TPoint; gRect :GRADIENT_RECT; Rgn :hRgn; begin if aPenSize > 1 then aPenSize := aPenSize div 2; //Crée le ploygone RgnVerts[0].X := X1 -aPenSize; RgnVerts[0].Y := Y1 -aPenSize; RgnVerts[1].X := X1 +aPenSize; RgnVerts[1].Y := Y1 +aPenSize; RgnVerts[2].X := X2 +aPenSize; RgnVerts[2].Y := Y2 +aPenSize; RgnVerts[3].X := X2 -aPenSize; RgnVerts[3].Y := y2 -aPenSize; Rgn := CreatePolygonRgn(RgnVerts, 4, WINDING); //Limite le dessin au polygone SelectClipRgn(aCanvas.Handle, Rgn); //Dégradé GradVert[0].x := X1 -1; GradVert[0].y := Y1 -1; GradVert[0].Red := GetRValue(aStartColor) *$100; GradVert[0].Green := GetGValue(aStartColor) *$100; GradVert[0].Blue := GetBValue(aStartColor) *$100; GradVert[0].Alpha := $FF00; GradVert[1].x := X2 +1; GradVert[1].y := Y2 +1; GradVert[1].Red := GetRValue(aEndColor) *$100; GradVert[1].Green := GetGValue(aEndColor) *$100; GradVert[1].Blue := GetBValue(aEndColor) *$100; GradVert[1].Alpha := $FF00; gRect.UpperLeft := 0; gRect.LowerRight := 1; GradientFill(aCanvas.Handle, @GradVert, 2, @gRect, 1, GRADIENT_FILL_RECT_H); //Supprime la limite de dessin SelectClipRgn(aCanvas.Handle, 0); end; procedure TForm1.FormPaint(Sender: TObject); begin DrawGradientLine(Canvas, 10, 10, ClientWidth -10, 40, clAqua, clBlue, 5); end;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager