Newsgroup: it.comp.lang.delphi
Titolo: Come riempire una qualsiasi regione chiusa con un colore di riempimento graduale

Salve ragazzi , siccome sono un principiante , volevo sapere quali sono 
le istruzioni in grafica Delphi che permettono di riempire una regione 
chiusa con un colore graduale di riempimento.Ad esempio:come faccio ad 
ottenere quell'effetto di riempimento graduale in una regione chiusa 
delimitata da due linee e un arco? Potreste gentilmente scrivermi un 
esempio con la sintassi delle istruzioni? Grazie mille e un saluto a 
tutti.
--- posted by geoForum on 
http://www.delphiedintorni.it

 tutti.
Usa l'API GradientFill
http://www.delphi-central.com/tutorials/DelphiGradientFill.aspx
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Grazie,ma quello che mi hai indicato tu lo sapevo gia'........c'e' anche 
la funzione GradientFillCanvas che fa' piu' o meno la stessa cosa 
ma.....queste due funzioni riempiono un rettangolo mentre invece a me 
serviva un modo per riempire una qualsiasi figura che non sia un 
poligono.Insomma uno spazio chiuso delimitato ad esempio da un arco e 
una linea ecc   ciao.


 
Mi sono recentemente imbattuto in questo componente che penso faccia 
quello che ti serve, ha anche una demo inclusa.
http://www.vclcomponents.com/Delphi/Graphical_Controls/TShapeEx-info.html
...Purtroppo non era il componente che serviva a me! :_P
Daniele

 ma.....queste due funzioni riempiono un rettangolo
GradientFill() non riempie solo rettangoli ma poligoni con N vertici (e un
arco si può ritenere una polyline con un alto numero di vertici). 
In ogni caso, la funzione che fa per te è FloodFill().



Della funzione FloodFill ne ero gia' a conoscenza infatti l'ho provata 
ad usare per riempire la figura con un unico colore e fin qui tutto a 
posto.Il problema e' sorto quando volevo riempirla gradualmente cioe' ad 
esempio dal rosso al verde ecc.Devo quindi usare prima GradientFill e 
poi FloodFill?E poi un'altra cosa:che intendi dire quando affermi che un 
arco puo' essere visto come una polyline con un alto numero di vertici? 
Ciao.


 arco puo' essere visto come una polyline con un alto numero di vertici? 
Esattamente ciň che ho detto: al tendere all'infinito il numero di vertici
di un poligono regolare, quest'ultimo tende ad essere una circonferenza.


di un poligono regolare, quest'ultimo tende ad essere una circonferenza.
Grazie adesso ho capito ma scusa se ti faccio un ultima domanda ( abbi 
pazienza sono un principiante ).Il codice del mio poligono e' questo:
Image1.Canvas.MoveTo(100, 100);
Image1.Canvas.LineTo(500, 150);
Image1.Canvas.LineTo(300, 80);
// arco che unisce le due linee
Image1.Canvas.Arc(40, 80, 500, 200, 300, 90, 50, 90);
Come scriveresti tu il GradientFill in questo caso? ( supponiamo ad 
esempio il riempimento dal rosso al giallo ). Grazie ciao.
N.B.:Ho disegnato su una TImage ( Align := alClient; ) per evitare i 
vari problemi con il Painting.


 una linea ecc   ciao.
Mmmm ... non la sai tanto bene.
Ecco un esempio, scopiazzando e modificando codice gia' esistente, di come
riempire un'area non rettangolare con l'API GradientFill:
<Inizio codice>
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    PaintBox: TPaintBox;
    procedure PaintBoxPaint(Sender: TObject);
    procedure DisegnaFettaDiTorta(aCanvas: TCanvas; const aRect: TRect);
    procedure DisegnaGradiente(aCanvas: TCanvas; const aRect: TRect);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.PaintBoxPaint(Sender: TObject);
begin
 DisegnaFettaDiTorta(Paintbox.Canvas, Paintbox.ClientRect);
end;
// Imposto i valori del Gradiente
procedure TForm1.DisegnaGradiente(aCanvas: TCanvas; const aRect: TRect);
var
  Vertices: array [0..3] of Trivertex;
  GTrigs: array [0..1] of TGradientTriangle;
begin
  Fillchar( Vertices, Sizeof(Vertices), 0);
  Vertices[1].X := aRect.Left;
  Vertices[1].Y := aRect.Top;
  Vertices[2].X := aRect.Right;
  Vertices[2].Y := aRect.Top;
  Vertices[3].X := aRect.Right;
  Vertices[3].Y := aRect.Bottom;
  Vertices[0].X := aRect.Left;
  Vertices[0].Y := aRect.Bottom;
  // Colori a caso
  Vertices[0].Red := $aaaa;
  Vertices[1].Blue := $FFFF;
  Vertices[1].Green := $1001;
  Vertices[2].Green := $FFFF;
  Vertices[3].Red := $FFFF;
  Vertices[3].Green := $FFFF;
  GTrigs[0].Vertex1 := 0;
  GTrigs[0].Vertex2 := 1;
  GTrigs[0].Vertex3 := 3;
  GTrigs[1].Vertex1 := 1;
  GTrigs[1].Vertex2 := 2;
  GTrigs[1].Vertex3 := 3;
  GradientFill(
    aCanvas.Handle,
    @Vertices,
    4,
    @GTrigs,
    2,
    GRADIENT_FILL_TRIANGLE);
end;
procedure TForm1.DisegnaFettaDiTorta(aCanvas: TCanvas; const aRect: TRect);
var
  Center: TPoint;
  PieRadius: Integer;
begin
  // Riempio di bianco lo sfondo dove poi disegnero'
  aCanvas.Brush.Color := clWhite;
  aCanvas.Brush.Style := bsSolid;
  aCanvas.FillRect(aRect);
  // creo una *regione* a forma di "fetta di torta"
  // (un arco e due segmenti) che riempiro' con
  // un gradiente
  // Vedi l'help delle API per maggiori info
  BeginPath(aCanvas.Handle);
  aCanvas.pie(10, 10, 200, 200, 61, 3, 72, 261);
  EndPath(aCanvas.Handle);
  SelectClipPath(aCanvas.Handle, RGN_COPY);
  DisegnaGradiente(aCanvas, aRect);
end;
end.
<Fine Codice>
Per provarlo, metti un PaintBox sulla form, chiamalo PaintBox e imposta il
suo evento OnPaint.
Testato con TurboDelphi
Ciao
-- 
ACSH
[TurboDelphi]
Chi fa da se', fatica il doppio


Scusa ACSH,ma siccome io sono un principiante,non ho capito quasi niente 
del codice che mi hai illustrato.Potresti gentilmente spiegarmi ogni 
istruzione e anche i parametri di GradientFill? Grazie ciao


 istruzione e anche i parametri di GradientFill? Grazie ciao
Per favore, visto che sei un principiante, innanzitutto impara a quotare
http://wiki.news.nic.it/QuotarBene
sennņ le tue risposte diventano rapidamente incomprensibili... :-/
Riguardo la richiesta di spiegarti passo passo, non credo che sia il
miglior modo per imparare delphi. Ora, non intendo intromettermi tra te e
il buon ACSH, ma credo che il magico tasto F1, se premuto su ognuno di
questi comandi a te sconosciuti, possa darti delle valide spiegazioni tanto
per incominciare..
Non credi ?
:-)
-- 
Morde


Non c'era bisogno di ricordarmi del tasto F1 perche' lo sapevo gia'.Se 
per questo si digita CTRL + F1 per aprire l'Help relativo alla parola 
dove si trova il cursore.Se io ho chiesto di darmi una spiegazione del 
codice e' perche' penso che a volte,la spiegazione di un esempio 
commentato riga per riga possa facilitare molto di piu' la comprensione 
di un argomento oltre al classico Help in linea ciao.


 
Se è per questo anche venire da te e di presenza spiegarti l'esempio riga
per riga ti faciliterebbe molto la comprensione.
Stai sbagliando e dispiace (a tutti) che non riesci a capire lo sbaglio.
Chiedere una spiegazione di una parte di un esempio , preciso ,
circostanziato, denota uno sforzo a comprenderlo, viceversa chiedere il
commento di ogni riga denota solo arroganza.
senza polemica , spero non ci siano fraintendimenti.
Peace
M. Rossello