Grafica din Delfi

Lucrul cu grafica din Delphi nu este doar linii și cifre, dar și documente de tip text și de imprimare. Prin urmare, în lucrul cu grafica Delphi ar trebui să aibă un pic de timp. Lucrul cu elemente grafice din Delphi implică un apel la panza - componente de proprietate Canvas. Canvas Delphi este o pânză care permite programatorului să aibă acces la fiecare punct (pixel), iar în cazul în care artistul pentru a afișa ceea ce doriți. Desigur, trage pixel cu pixel pentru grafica din Delphi nu este necesar, sistemul Delphi oferă instrumente puternice pentru lucrul cu grafica. facilita sarcina programatorului.

Desigur, nu toate componentele din Delphi au aceste proprietăți. În fila suplimentară este o TImage componentă specializată. special concepute pentru pictura, dar, de asemenea, au proprietatea de Canvas, de exemplu, componente, cum ar fi ListBox, ComboBox, StringGrid, precum și însăși forma care plasează componentele noastre! În plus, Delphi pentru imprimarea documentelor se referă la proprietatea obiectului Canvas, cum ar fi o imprimantă.

Proprietatea principală a unui astfel de obiect ca panza Delphi - Pixels [i, j] tip TColor. adică, o matrice bidimensională de puncte (pixeli) definite prin culoarea sa. Bazându-se pe panza are loc atunci când atribuirea oricărui punct de culoare dat de panza. Fiecare pixel poate fi atribuit orice culoare pentru Windows disponibile. De exemplu, afirmația este

roșu de plumb pentru trasarea unui punct cu coordonate [100, 100]. Aflați mai multe culori pixel poate inversa asignarea:

Type TColor definit ca un întreg lung (LongInt). Cele patru octeți conțin informații despre proporțiile albastru (B), verde (G) și culori (R) de culoare roșie. În sistemul de 16-ary, se pare ca acest lucru: $ 00BBGGRR. Proporția de fiecare culoare poate varia de la 0 la 255. Prin urmare, pentru a afișa punctul cel mai roșu, este necesar să se atribuie o culoare $ 000000FF.
Pentru culori standard în Delphi definit un set de constante de text. Acesta poate fi văzut prin deschiderea obiectului proprietății inspector de culoare, de exemplu, aceeași formă.

Tabelul următor listează unele dintre proprietățile și metodele de panza:

Procedura TextOut (X, Y: Integer; Text const: WideString);
Textul produce linie de ieșire pornind de la (X, Y) - pixelului din stânga sus a textului.

proprietate textwidth (var Text: String): Integer;
Cu un conținut de lungime șir de text în pixeli.

proprietate TextHeight (var Text: String): Integer;
Cu un conținut de text înălțimea liniei în pixeli.

FillRect Procedura (const Rect: TRect);
RECT Umple un dreptunghi pe panza folosind peria curentă. Acesta poate fi folosit, inclusiv, pentru ștergerea imaginii de pe panza.


Scrie, folosind doar metodele de panza, o aplicație imagine de pe componenta panza textul din imagine, care este introdus în componenta Memo:

Poziția pe componentele forma Memo imagine (localizată pe pagina suplimentară), Editare, UpDown (localizat pe pagina Win32). Asociat UpDown proprietate componentă Echivala în lista verticală Editare noastre componente. Această componentă vom schimba dimensiunea fontului. Deoarece ambele Memo si Image suntem pe aceeași dispozitiv de ieșire - pe ecranul nostru, dimensiunea pixelilor au aceleași, și, prin urmare, dimensiunea imaginii va fi egală.

Grafica din Delfi

Primul lucru pe care îl facem este inițializa variabilele la începutul programului. Este necesar să se determine dimensiunea zonei de desen (acest lucru va crea o variabilă de tip la nivel mondial Dreptunghi TRect) și de a face culoarea de fundal alb Imagine:

Procedura TForm1.FormCreate (Expeditor: TObject);
începe
Rect.Left: = 0;
Rect.Top:=0;
Rect.Right: = Image1.Width;
Rect.Bottom: = Image1.Height;
Image1.Canvas.Brush.Color: = clWhite;
se încheie;

Apoi desena un cadru în jurul valorii de părțile laterale ale imaginii:

Procedura TForm1.page;
începe
cu Image1.Canvas do
începe
MoveTo (0, 0);
LineTo (Image1.Width-1, 0);
LineTo (Image1.Width-1, Image1.Height-1);
LineTo (0, Image1.Height-1);
LineTo (0, 0);
se încheie;
se încheie;

Să încercăm asta. Totul funcționează, dar rama nu este încă afișată. Deci, vom adăuga o procedură de pagină în procedura FormCreate. Acum frumos. Apoi, a scrie o procedură simplă ștergere de purificare de imagine. Acesta trebuie să fie numit înainte de orice reînnoire a imaginii, în caz contrar imaginile anterioare și ulterioare se vor suprapune.

Procedura TForm1.clearing;
începe
Image1.Canvas.FillRect (Rect); // Rect dreptunghi umplut cu alb, imaginea este ștearsă.
se încheie;

Acum a venit rândul procedurii directe de text. Textul de afișare începe de la punctul (3, 3) - colțul din stânga sus al foii cu o adâncitură mică 3 în pixel. Fiecare linie ulterioară se va deplasa la înălțimea unui rând:

Procedura TForm1.prn;
var i: Integer;
începe
cu Image1.Canvas do
pentru i: = 1 la Memo1.Lines.Count do
TextOut (3, 3+ (i-1) * TextHeight ( 'A'), Memo1.Lines [i-1]);
se încheie;

Acum totul este gata pentru producția de text. Făcând acest eveniment va onchange:

Procedura TForm1.Memo1Change (Expeditor: TObject);
începe
de compensare;
PRN;
pagină;
se încheie;

Și, în sfârșit, cum se schimba dimensiunea fontului:

Procedura TForm1.Edit1Change (Expeditor: TObject);
începe
Memo1.Font.Size: = UpDown1.Position;
Image1.Canvas.Font.Size: = UpDown1.Position;
Memo1Change (Sender);
se încheie;

Puteți modifica acest program pentru textul de ieșire care urmează să fie imprimat. Pentru a lucra cu imprimanta trebuie să fie conectată modulul de imprimante:

utilizări
Ferestre, Mesaje, SysUtils, variante, Clase, grafică, controale, Formulare,
Dialoguri, StdCtrls, imprimante;

Când utilizați imprimanta cu atât lama pentru a începe metoda numită BeginDoc de imprimare. apoi a produs un document de ieșire, imprimarea este finalizată prin apelarea metodei EndDoc:

Printer.BeginDoc;
cu Printer.Canvas do
începe
. Imprimarea unui document.
se încheie;
Printer.EndDoc;

Lățimea și înălțimea imprimantei sunt disponibile prin proprietățile de material textil și Printer.PageWidth Printer.PageHeight. După imprimarea pe aceeași pagină și începe imprimarea pe de altă parte, puteți utiliza metoda Printer.NewPage.

Este nevoie de parametrii

Rect - desen un dreptunghi cu dimensiuni
var Rect: TRect;

Grafica - una din clasele de imagini, cum ar fi TBitmap
var Foto: TBitmap;

Prin urmare, în cazul OnCreate formulare a crea un dreptunghi cu dimensiunea formei:

Rect.Left: = 0;
Rect.Top:=0;
Rect.Right: = Lățime;
Rect.Bottom: = înălțime;

și Bitmap obiect:

Bitmap are metoda de încărcare a imaginii:

Arată figura nu trebuie în momentul creării de forme, dar cu o mică întârziere, l-am introdus cu un temporizator cu o întârziere de 10 ms. Asta e tot. Sa întâmplat:

var
Form1: TForm1;
RECT: TRect;
Foto: TBitmap;

Application.Icon.LoadFromFile ( „numele fișierului a pictogramei“);

aceste linii după procedura FormCreate (Expeditor: TObject);

care a reușit să facă o undă sinusoidală, dar fără o perioadă, aici este codul - Works!

Mi-ar face mai ușor. Prima linie au efectuat o coordonată de-a lungul axei X și crestăturile corespunzătoare unei perioade de 2 * Pi:

Canvas.MoveTo (0, Inaltime div 2);
Canvas.LineTo (lățime, înălțime div 2);
PX: = 0;
Perioada: = 2 * Pi;
Yo: = Trunc (înălțime / 2);
în timp ce PX
Apoi, aș construi grafic Y: = sin (X) + sin (X / 5):

Canvas.MoveTo (0, Inaltime div 2);
pentru PX: = 0 până la lățime face
începe
Y: = sin (Px) + sin (Px / 5);
Py: = Yo-trunc (Y);
Canvas.LineTo (Px, Py);
se încheie;

Dar se pare că nici un calendar, și mânji - prea mici. Introducerea scara, timpii X-20, și Y din 100. Și acest lucru este ceea ce se întâmplă:

Procedura TForm1.FormPaint (Expeditor: TObject);
var X, Y: Real;
Perioada: Real;
Mx, My, Px, Py, Yo: Integer;
începe
Mx: = 20; Mea: = 100;
Canvas.MoveTo (0, Inaltime div 2);
Canvas.LineTo (lățime, înălțime div 2);
Canvas.MoveTo (0, Inaltime div 2);
Perioada: = 2 * Pi * Mx;
Yo: = Trunc (înălțime / 2);
pentru Px: = 0 până la lățime face
începe
Y: = sin (Px / Mx) + sin (Px / 5 / Mx);
Py: = Yo-trunc (Y * Meu);
Canvas.LineTo (Px, Py);
se încheie;
X: = 0;
Canvas.Pen.Width: = 2;
Canvas.Pen.Color: = clRed;
în timp ce X
A suferit doar o crestătură a procedurilor, vopsite în culoarea roșie, și a făcut mai gros. Kirill, a adăugat 28.02.12, 17:40:03
Bună seara, eu nu pot termina treaba spune-mi: trebuie să cerc cu raza mică de mișcare de-a lungul liniilor de stele și șapte-radiat. aici sunt realizările mele:
Procedura TForm3.a (Expeditor: TObject; var cheie: Char);
începe
cc: = cheie; edit1.Text: tasta =;
se încheie; // responsabil pentru controlul procesului

TForm3.s Procedura (Expeditor: TObject);
var x, y, r, j, i: cuvânt; B: array [1..360] integer; G: array [1..360] din întreg;
o: reală;
începe
R: = 200;
pentru i: = 0-360 do
începe
dacă i Mod 45 = 0 atunci
a: = (i * pi) / 180;
x: = 250 + rotund (R * cos (a));
y: = 250 + rotund (R * sin (a));
b [i]: = x; g [i]: = y;
se încheie;
canvas.MoveTo (b [45], g [45]);
canvas.LineTo (b [180], g [180]);
canvas.LineTo (b [315], g [315]);
canvas.LineTo (b [90], g [90]);
canvas.LineTo (b [225], g [225]);
canvas.lineto (b [360], g [360]);
canvas.LineTo (b [135], g [135]);
canvas.LineTo (b [270], g [270]);
canvas.LineTo (b [45], g [45]); // a atras Heptagon.
începe
form3.Color: = clnavy;
form3.KeyPreview: = true;
canvas.Pen.Width: = 3; a: = 0;
repeta
Application.processMessages;
canvas.Pen.Color: = clyellow;
canvas.ellipse (x, y, x + 12, y + 12);
somn (5);
canvas.Pen.color: = clNavy;
Canvas.Ellipse (x, y, x + 12, y + 12); // elipsă gol cu ​​raze pe aceleași linii. dar aceasta nu funcționează.
până cc = 'q'; // q cheie este responsabil pentru sfârșitul operațiunii altfel opri.

În continuare. Desenează o elipsă.

canvas.Pen.Width: = 3; a: = 0;
repeta
Application.processMessages;
canvas.Pen.Color: = clyellow;
canvas.ellipse (x, y, x + 12, y + 12);
somn (5);
canvas.Pen.color: = clNavy;
Canvas.Ellipse (x, y, x + 12, y + 12);
până cc = 'q';

a: = 0; - de ce, în cazul în care este folosit?

Cum va mișcarea? Coordonatele nu se schimbă.

Și cum ai de gând să calculeze fiecare pixel al stea la o elipsă pe ea a mers? Aceasta nu este o declarație de eroare, doar întrebam.

Și frumos centrul cercului atunci când se deplasează de-a lungul liniei, și ai un colț al pieței, în cazul în care acesta este introdus. Corect deoarece:

O mișcare de oprire. Prin introducerea de caractere în Editare. Natural de a introduce o variabilă

var Mutare: Boolean = false;

repeta
calculator
până Mutare = False;

Deci, modificați variabila prin apăsarea butonului:

Form1.Canvas.Ellipse (100, 100, 200, 200);

Și toate narisuetsya.Napishite opțiunea, cu un aspect care nu este așa.

Procedura TForm1.Button1Click (Expeditor: TObject);
var x1, y1, x2, y2: Integer;
începe
X1: = 100; y1: = 100;
X2: = 200; y2: = 200;
canvas.Ellipse (x1, y1, x2, y2);
se încheie;

Read (F, x, y, radon);
caz de radon din
1..10: Image1.Canvas.Brush.Color: = clGreen;
11..20: Image1.Canvas.Brush.Color: = clYellow;
21..30: Image1.Canvas.Brush.Color: = clRed;
Image1.Canvas.Ellipse (x-6, y-6, x + 6, y + 6);
se încheie;

Image1.Canvas.Ellipse (x-6, y-6, x + 6, y + 6);

Procedura TForm1.Timer1Timer (Expeditor: TObject);
începe
Image1.Canvas.MoveTo (Xo, Yo);
Image1.Canvas.LineTo (X1, Y1);
Xo: = X1;
Yo: = Y1;
se încheie;

Procedura TForm1.Image1MouseDown (Expeditor: TObject; buton: TMouseButton;
Shift: TShiftState; X, Y: Integer);
începe
dacă Timer1.Enabled = false atunci
începe
Xo: = X;
Yo: = Y;
Timer1.Enabled: = Adevărat;
se încheie;
se încheie;

Procedura TForm1.Image1MouseUp (Expeditor: TObject; buton: TMouseButton;
Shift: TShiftState; X, Y: Integer);
începe
Timer1.Enabled: = False;
se încheie;

Uneori există o situație în care este necesar, în cadrul programului pentru a redimensiona componenta TImage, iar apoi pe panza lui de a desena ceva. Dar toate noile imagini pe panza limitate TImage dimensiuni vechi. Cum să o rezolve?

Necesar cu dimensiuni TImage pentru a redimensiona Bitmap sale.

Image1.Height: = 80;
Image1.Width: = 33;
Image1.Picture.Bitmap.Height: = 80;
Image1.Picture.Bitmap.Width: = 33;

Calculator linie RelatedCommand pe șine - dentaku
În „Programarea“ Cum se schimbă crHandPoint implicit la sistemul (Delphi)
În „Programare“ Cine a sunat PopupMenu? (Delphi)
În „Programare“

articole similare