Das Canvas- · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten...

12

Click here to load reader

Transcript of Das Canvas- · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten...

Page 1: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Das Canvas- Objekt

Der von DOS kommende Umsteiger ist es gewohnt, dass sich Grafikanweisungen stets auf den gesamten Bildschirm beziehen. Von dieser Vorstellung müssen Sie sich trennen! Unter Delphi haben wir es mit Grafikmethoden zu tun, die sich immer nur auf die Zeichenfläche (Canvas) eines bestimmten Objekts1 beziehen, z.B.: ? Formulare ? Image-Komponenten ? Paintbox-Komponenten ? Drucker (Printer) Dies hat unter anderem zur Folge, dass ein und dieselbe Grafikanweisung, auf unterschiedlichen Objekten ausgeführt, zu unterschiedlichen Ergebnissen führen kann. Ein Canvas-Objekt kann weitere untergeordnete Objekte enthalten. Dazu zählen unter anderem Pen-, Brush- und Font-Objekte, die wiederum Eigenschaften haben. Die folgende Abbildung soll diesen Sachverhalt am Beispiel des Canvas eines Image-Objekts verdeutlichen:

Während Pen Ihr "Stift" ist, mit dem Sie auf dem Canvas zeichnen und für den Sie die Eigenschaften Width (Linienstärke), Color (Farbe) und Style (Linienart) einstellen können, versteht man unter Brush die "Bürste", mit der man geschlossene Flächen mit Farbe und Muster ausfüllt. Hierfür und auch um z.B. eine andere Schriftfarbe einzustellen, müssen Sie wissen, für welches Objekt (Form, Image, Printer) diese Änderungen vorgenommen werden sollen. So weisen Sie dem Canvas eines Formulars das "Malerwerkzeug" zu, d.h. einen roten Stift und eine gelbe Bürste. Form1.Canvas.Pen.Color := clRed; Form1.Canvas.Brush.Color := clYellow; oder auch einfacher Canvas.Pen.Color := clRed; Canvas.Brush.Color := clYellow; wenn sich der Quellcode in einem Event-Handler von Form1 befindet. Die Zuweisung einiger Eigenschaften für ein Bildfeld: Form1.Image1.Canvas.Font.Color := clRed; // rote Schrift Form1.Image1.Canvas.Font.Size := 12; // 12 dpI

Page 2: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Form1.Image1.Canvas.Pen.Color := clBlack; // schwarzer Zeichenstift Form1.Image1.Canvas.Brush.Style := bsClear; // transparente Füllung Ziemlich aufwändig, nicht wahr? Wenn Sie mehrere Properties festlegen wollen, ist mit diesen "Bandwurmeigenschaften" schon eine ganze Menge an Tipparbeit verbunden. Aber vielleicht erinnern Sie sich noch an die with-Anweisung aus dem Sprachkapitel 2. Obiges Beispiel kann kürzer so formuliert werden: with Form1.Image1.Canvas do begin Font.Color := clRed; Font.Size := 12; Pen.Color := clBlack; Brush.Style := bsClear end; Das sieht doch schon etwas freundlicher aus, aber nun der Reihe nach.

Koordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf den Drucker. Maßeinheit ist immer Pixel, was allerdings beim Drucker etwas sinnlos erscheint. Wer möchte schon, dass ein Bild auf einem 150-dpi-Drucker viermal so groß wie auf einem 600-dpi-Drucker ist? Wie Sie dieses Problem elegant umgehen, lesen Sie im Beispiel 8.10.1 ("Drucken einer Textdatei"). Ein weiteres Problem bereitet dann Kopfzerbrechen, wenn ein Programm auf Bildschirmen mit unterschiedlicher Grafikauflösung laufen soll, z.B. 640 x 480, 800 x 600 und 1024 x 768 Pixel. Zwar gibt es die Eigenschaften PixelsPerInch und Scaled (letztere muss True gesetzt werden, damit PixelsPerInch wirksam wird), und man kann durch diverse Umrechnungen für eine leidliche Anpassung sorgen, doch erfahrungsgemäß ist man erst dann auf der absolut sicheren Seite, wenn man das Brett an der dünnsten Stelle bohrt und seine Fenster nicht größer als die niedrigstmögliche Auflösung (640 x 480) entwirft bzw. unterschiedliche Versionen herausgibt1. HINWEIS: Eine Koordinatenumwandlung ist auch mit den Methoden ScreenToClient und ClientToScreen möglich. Es gibt noch eine Reihe weiterer Vorsorgemaßnahmen, die der Programmierer treffen kann, um seine Applikation weniger anfällig gegenüber unterschiedlichen Grafikauflösungen zu machen, beispielsweise das Zentrieren der Fenster.

Obige Abbildung verdeutlicht die Bedeutung verschiedener Eigenschaften. Left und Top bezeichnen den Abstand der linken bzw. oberen Kante des Objekts zur linken bzw. oberen Kante des umgebenden Objekts (Clientbereich). Width und Height bezeichnen die äußeren Abmessungen eines Objekts. Beachten Sie, dass im vorliegenden Koordinatensystem die y-Achse gekippt ist,

Page 3: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

d.h., positive y-Werte werden nach unten abgetragen. Wenn auch in obiger Abbildung ClientWidth und Width nahezu identisch erscheinen, so wird der Unterschied dann deutlich, wenn z.B. ein dickerer Rahmen oder eine vertikale Bildlaufleiste hinzukommen. Wesentlich wird diese Unterscheidung bei vielen GDI-Funktionen, denen Sie eine Variable vom Typ TRect übergeben müssen (siehe Kapitel 15). Verwenden Sie in diesen Fällen immer die Innenabmessungen der Komponenten (z.B. Image).

Grundlegende Zeichenfunktionen Die Zeichenfunktionen unter Delphi sind meist Methoden und nur ausnahmsweise Eigenschaften des Canvas-Objekts. Die zu übergebenden Koordinaten sind im Allgemeinen vom Integer-Typ. Punkt Auf einen Punkt greifen Sie über die Pixels-Eigenschaft zu. Canvas.Pixels[x,y:Integer] Beachten Sie die eckigen Klammern!

Eine waagerechte blaue Linie auf Form1 zeichnen var i: Word; ... for i := 0 to Form1.ClientWidth do Form1.Canvas.Pixels[i,100] := clBlue Der Vorteil einer Eigenschaft anstatt einer Methode ist, dass Sie damit die Farbe eines Punktes nicht nur setzen, sondern auch lesen können. var farbe: TColor; ... farbe := Canvas.Pixels[300,50]; Aktuelle Stiftposition Die Eigenschaft PenPos spiegelt die gegenwärtige Position des Stifts wider. Canvas.PenPos: TPoint Der (von Delphi bereitgestellte) Datentyp TPoint hat folgende Struktur: TPoint = record X,Y: LongInt; end; var ecke: TPoint; links: LongInt; ... links := Canvas.PenPos.X; ecke := Canvas.PenPos; Linie Linien können Sie nicht mit einem einzigen Befehl zeichnen. Legen Sie zuerst den Startpunkt mit der Methode MoveTo fest. Gezeichnet wird von dieser Position aus mit der Methode LineTo, die den Endpunkt bestimmt: Canvas.MoveTo(x1,y1:Integer); Canvas.LineTo(x2,y2:Integer)

Page 4: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Image1.Canvas.MoveTo(10,10); Image1.Canvas.LineTo(100,100); Auch über diese Absonderlichkeit von Delphi sollte man Bescheid wissen: Kreis, Ellipse Eine direkte Funktion zum Zeichnen eines Kreises gibt es nicht. Der Kreis wird als Spezialfall der Ellipse angesehen. Als Koordinatenangaben dienen die linke obere und die rechte untere Ecke des umrahmenden Rechtecks. Canvas.Ellipse(x1,y1,x2,y2:Integer)

Canvas.Ellipse(25,67,143,231); ... zeichnet eine Ellipse. Canvas.Ellipse(25,25,100,100); ... zeichnet einen Kreis mit einem Durchmesser von 75 Pixeln. Canvas.Ellipse(x0-r,y0-r,x0+r,y0+r); ... zeichnet einen Kreis mit dem Mittelpunkt x0,y0 und dem Radius r.

Rechteck Das Zeichnen von Rechtecken bedarf wohl keiner besonderen Erläuterung. Canvas.Rectangle(x1,y1,x2,y2:Integer)

Image1.Canvas.Rectangle(10,10,100,100); Abgerundetes Rechteck Diese Figur wird wie ein Rechteck gezeichnet, die Ecken werden jedoch als Ellipsenviertel der Breite X3 und der Höhe Y3 dargestellt. Ist Brush.Style <> bsClear, wird das Rechteck mit dem aktuellen Pinsel gefüllt. Canvas.RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer)

Page 5: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Canvas.RoundRect(10,10,100,100,10,5); Tortenstück Die Methode Pie zeichnet ein Segment, das durch eine Ellipse und zwei Linien begrenzt ist. Für Brush.Style <> bsClear wird das Segment mit dem aktuellen Pinsel gefüllt. Canvas.Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: LongInt)

Canvas.Pie(0,0,500,400, 500, 0, 250, 400); Bogenstück Die Methode Arc zeichnet im Gegensatz zur Methode Pie nur den Bogen, nicht die Verbindungen zum Ellipsenmittelpunkt. Aus diesem Grund kann die Figur auch nicht gefüllt werden. Canvas.Arc(x1,y1,x2,y2,x3,y3,x4,y4:Integer)

Canvas.Pie(0,0,500,400, 500, 0, 250, 400); Kreisstück Mit Hilfe der Methode Chord können Sie den Teil eines Kreises zeichnen, der durch eine Sehne abgeteilt ist. Canvas.Chord(x1,y1,x2,y2,x3,y3,x4,y4:Integer)

Canvas.Chord(0,0,500,400, 500, 0, 250, 400); Mehrfachlinie Die PolyLine-Methode arbeitet ähnlich wie MoveTo und LineTo, Sie können jedoch mehrere Punkte auf einmal übergeben. Canvas.PolyLine([Point(x1,y1),Point(x2,y2),Point(x3,y3), ...])

Page 6: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Canvas.PolyLine([Point(10,15),Point(100,200),Point(300,150)]); oder etwas umständlicher: var punkte: array[1..3] of TPoint; ... punkte[1].x := 10; punkte[1].y := 15; punkte[2].x := 100; punkte[2].y := 200; punkte[3].x := 300; punkte[3].y := 150; Canvas.PolyLine(punkte);

Polygon Möchten Sie ein gefülltes n-Eck zeichnen, müssen Sie auf die Polygon-Methode zurückgreifen. Canvas.Polygon([Point(x1,y1),Point(x2,y2),Point(x3,y3), ...])

Füllfarbe und -muster entsprechen der aktuellen Brush-Eigenschaft des Canvas. Canvas.Polygon([Point(10,10),Point(100,200),Point(300,150)]);

Farben Farben setzen sich unter Windows aus der additiven Überlagerung der drei Grundfarben Rot, Grün und Blau zusammen (RGB). Da jeder Farbanteil in 256 Farbstufen unterteilt ist, ergibt sich eine maximale Anzahl von ca. 16 Mio. Farben. Bei dieser Auflösung ist das menschliche Auge nicht mehr in der Lage, einzelne Abstufungen wahrzunehmen, man spricht von Echtfarben.

HINWEIS: Beachten Sie, dass eine additive Farbmischung auf einem Drucker nicht sinnvoll ist. Rot + Blau + Grün ergeben Schwarz und nicht Weiß, aber dies nur nebenbei, da Windows uns weitergehende Überlegungen dieser Art abnimmt. Unter Delphi werden Farbwerte als Datentyp TColor abgespeichert. var hColor : TColor; ... hColor := Canvas.Brush.Color; HINWEIS: Brauchen Sie eine Variable zum Zwischenspeichern von Farbwerten, kann diese vom Typ TColor oder LongInt sein. Für das Zuweisen von Farbwerten gibt es zwei prinzipielle Möglichkeiten: ? Benutzen der in der Unit Graphics definierten Farbkonstanten ? Verwenden einer 4-Byte-Hexadezimalzahl Zwei Möglichkeiten, um die Farbe Rot zuzuweisen: Canvas.Brush.Color := clRed; oder Canvas.Brush.Color := $000000FF; Im Folgenden wollen wir uns jede der beiden Varianten näher anschauen.

Page 7: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

RGB-Farben Um zu verstehen, wie Farbwerte als 4-Byte-Hexadezimalzahl gespeichert werden können, müssen wir wissen, dass zur Darstellung eines Bytes zwei Hexziffern benötigt werden. Eine einzelne Hex ziffer wird durch eines der 16 Zeichen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F dargestellt. Die drei niederwertigen Bytes geben die RGB-Farbintensität für Blau, Grün und Rot an. Pro Byte können demnach 256 Werte gespeichert werden. Der Wert $00FF0000 entspricht einem reinen Blau mit voller Intensität, der Wert $0000FF00 einem reinen Grün und der Wert $000000FF einem reinen Rot. $00000000 gibt Schwarz und $00FFFFFF Weiß an. In der Abbildung wird eine graublaue Farbe definiert.

Wenn das höchstwertige Byte den Wert null ($00) hat, sind die Farben denen in der Systempalette am ähnlichsten. Ist es eins ($01), entspricht die Farbe etwa derjenigen in der aktuell realisierten Palette. Zwei ($02) bedeutet, der Wert wird an die ähnlichste Farbe in der logischen Palette des aktuellen Gerätekontexts angepasst. Um sich die lästige Umrechnerei in Hexadezimalzahlen zu ersparen, kann man auch eine Funktion schreiben, der die einzelnen Farbanteile als Prozentwerte zwischen 0 und 100 übergeben werden: function RGB(rot, gruen, blau: Byte): TColor; begin result := StrToInt('$00' + IntToHex(blau * 255 div 100, 2) + IntToHex(gruen * 255 div 100,2) + IntToHex(rot * 255 div 100, 2)) end; Kreis mit graublauer Mixfarbe (75 % Blau-, 50 % Grün- und 25 % Rotanteil) Canvas.Brush.Color := RGB(25,50,75); Canvas.Ellipse(100,100,300,300); Farbkonstanten In der Unit Graphics sind zahlreiche Konstanten für TColor definiert. Diese Konstanten unterteilen sich in zwei Gruppen: ? Die Farbkonstanten werden direkt der ähnlichsten Farbe in der Systempalette zugeordnet (z.B. clRed für die Farbe Rot). ? Die Farbkonstanten werden der entsprechenden Systemfarbe für Desktop-Elemente zugeordnet, die im Dialogfeld "Farben" der Windows-Systemsteuerung definiert ist (z.B. clBtnFace für Schaltflächen). Hier eine Zusammenstellung: Konstanten für ähnlichste Systemfarben Konstanten für Desktop-Farben clAqua, clBlack, clBlue, clDkGray, clFuchsia, clGray, clGreen, clLime, clLtGray, clMaroon, clNavy, clOlive, clPurple, clRed, clSilver, clTeal, clWhite, clYellow. clActiveBorder, clActiveCaption, clAppWorkSpace, clBackground, clBtnFace, clBtnHighlight, clBtnShadow, clBtnText, clCaptionText, clGrayText, clHighlight, clHighlightText, clInactiveBorder, clInactiveCaption, clInactiveCaptionText, clMenu, clMenuText, clScrollBar, clWindow, clWindowFrame, clWindowText

Page 8: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Linienfarbe, Muster und Pinsel Farbeigenschaften Für die Ausgabe von Linien, Mustern und Texten sind für uns vor allem folgende Eigenschaften und Objekte interessant: Eigenschaft Objekt Bemerkungen Linienfarbe Pen.Color ... ist gleichzeitig Rahmenfarbe für Kreise, Rechtecke etc. Füllfarbe Brush.Color ... wird nur berücksichtigt, wenn Brush.Style <> bsClear. Füllmuster Brush.Style Die Farbe des Füllmusters hängt von Brush.Color ab. Die möglichen Füllmuster finden Sie in der folgenden Abbildung. Textfarbe Font.Color Abhängig von der Farbauflösung kann nicht jede Farbe zugewiesen werden. Füllmuster Beachten Sie in der folgenden Zusammenstellung, dass die Konstante bsClear die Füllfarbe Brush. Color außer Kraft setzt und quasi den Hintergrund "durchscheinen" lässt (transparente Füllung). Der Standardwert ist bsSolid. HINWEIS: Die folgenden Füllmuster sind nicht vom gesetzten Abbildungsmodus abhängig, d.h., auf einem hochauflösenden Ausgabegerät (z.B. Laserdrucker) kann sich der Linienabstand sehr stark verringern. Für das DIN-gerechte Schraffieren von Flächen müssen Sie gegebenenfalls mit einem eigenen Algorithmus sorgen (siehe Regions).

Linien und Stifte Linieneigenschaften Im Wesentlichen bietet Delphi nur drei Eigenschaften, um Linienart und -form zu beeinflussen: Eigenschaft Objekt Beschreibung Linienbreite Pen.Width ... in Pixeln, die Linienenden werden abgerundet. Linientyp Pen.Style ... nur wenn Pen.Width = 1, siehe nächste Abbildung. Zeichenmodus Pen.Mode ... Farbverknüpfung mit dem Hintergrund. Linientypen Der Pen.Style-Eigenschaft des Canvas-Objekts können Sie die folgenden Konstanten zuweisen

Zeichenmodus Mit Pen.Mode legen Sie fest, in welcher Farbe eine Linie bzw. ein Pixel erscheint. "Wird dies nicht bereits mit der Eigenschaft Pen.Color entschieden?", werden Sie erstaunt fragen. Die Antwort ist ein klares Jein, denn die resultierende Linienfarbe entspricht nur dann der Stiftfarbe, wenn Pen.- Mode auf seinen Standardwert pmCopy gesetzt ist. In allen anderen Fällen kann eine völlig neue Farbe als Resultat einer bestimmten Verknüpfung mit dem Hintergrund entstehen.

Page 9: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Im folgenden Beispiel wird der verzweifelte, weil farblose, Versuch unternommen, die insgesamt 16 verschiedenen Werte der Eigenschaft Pen.Mode zu erläutern. Ein Farbgitter laut folgender Abbildung wird erzeugt. Die senkrechten Balken sind in den 16 Standardfarben (2 = clRed), die waagerechten Balken hingegen immer mit Pen.Color = clRed gezeichnet. Nur bei Pen.Mode = pmCopy entsteht aber tatsächlich ein roter waagerechter Balken.

Die folgende Funktion liefert die 16 Farbkonstanten: function qbColor(i:Integer):TColor; begin case i of 0: result:=clBlack; 1: result:=clMaroon; 2: result:=clGreen; 3: result:=clOlive; 4: result:=clNavy; 5: result:=clPurple; 6: result:=clTeal; 7: result:=clGray; 8: result:=clSilver; 9 :result:=clRed; 10: result:=clLime; 11: result:=clBlue; 12: result:=clFuchsia; 13: result:=clAqua; 14: result:=clYellow; 15: result:=clWhite end end; Das Farbgitter wird erzeugt: procedure TForm1.FormPaint(Sender: TObject); var i:Integer; begin with Canvas do begin Pen.Width := 25; // Balkenbreite Vertikale Farbbalken zeichnen: for i := 0 to 15 do begin MoveTo((i+1)*40,0); Pen.Color := qbColor(i); // neue Zeichenfarbe LineTo((i+1)*40,ClientHeight) end; Horizontale Farbbalken zeichnen:

Page 10: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Pen.Color := clRed; for i := 0 to 15 do begin Pen.Mode := TPenMode(i); // neuer Zeichenmodus MoveTo(0,(i+1)*40); LineTo(ClientWidth,(i+1)*40) end end end; Es wird empfohlen, sich dieses Beispiel live anzusehen, denn nur so erhalten Sie einen informativen (weil farbigen) Eindruck!

Animationen In der Praxis haben neben pmCopy vor allem pmXOR und pmNotXOR als Werte für die Eigenschaft Pen.Mode Bedeutung. Damit lassen sich auf einfachste Weise Animationen erzeugen, da eine zweifache Anwendung der XOR-Verknüpfung die Originalfarbe wiederherstellt und damit der Hintergrund quasi restauriert wird. Auf einem Formular mit einem Timer (Interval = 100) wird ein sich langsam von links nach rechts bewegender Kreis erzeugt. Dieser wandert durch ein gefülltes Rechteck, ohne es zu verletzen. var x1:Integer = 10; y1:Integer = 100; // Anfangsposition x2:Integer = 60; y2:Integer = 150; procedure TForm1.Timer1Timer(Sender: TObject); begin Canvas.Ellipse(x1,y1,x2,y2); // Löschen der alten Position durch Überzeichnen Inc(x1,2); Inc(x2,2); // neue Position einstellen Canvas.Ellipse(x1,y1,x2,y2) // auf neuer Position zeichnen end; procedure TForm1.FormPaint(Sender: TObject); begin Canvas.Pen.Mode := pmCopy; // Standardeinstellung Canvas.Brush.Color := clRed; // rote Füllfarbe Canvas.Rectangle(200,50,400,200); // ein rot gefülltes Rechteck Canvas.Pen.Mode := pmXOR; // XOR-Verknüpfung der Pixel Canvas.Ellipse(x1,y1,x2,y2); // Anfangsposition zeichnen Timer1.Enabled := True // Animation starten end; Nach Programmstart sehen Sie, dass die Füllfarbe des Kreises nicht Brush.Color = clRed entspricht, sondern in Abhängigkeit von der Farbe des Untergrunds zwischen Türkis und Schwarz wechselt. Wen das stört, der sollte es einmal mit Pen.Mode := pmNotXOR oder Brush.Style := bsClear versuchen.

Bemerkungen ? Keine Frage, dass Sie auf diese Weise auch Männchen quer über den Canvas sprinten lassen oder gar ein richtiges Autorennen programmieren können. Siehe dazu auch die Beispiele im Kapitel 6 (OOP). ? Eine weitere Anwendung finden Sie im Praxisteil dieses Kapitels (7.5.2, Erzeugen eines Markierungsrahmens).

Textausgabe Auch die Ausgabe von Text wird in Delphi mit Grafikmethoden realisiert.

Page 11: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

TextOut Diese Methode ist die einfachste Möglichkeit, einen Text auf den Bildschirm bzw. auf Papier zu bringen. Als Schriftart wird dabei der aktuelle Wert von Font verwendet. Canvas.TextOut(X,Y:Integer,Text:String); X und Y bezeichnen die linke obere Ecke des Ausgaberechtecks. Canvas.TextOut(100,100,'Äquator');

TextRect Wenn Sie nur denjenigen Teil eines Textes ausgeben wollen, der innerhalb eines Clipping-Rechtecks liegt, verwenden Sie diese Methode. Canvas.TextRect(Rect: TRect; X, Y: Integer; Text: string) Die Maße des begrenzenden Rechtecks müssen Sie in einer Variablen vom Typ TRect übergeben: TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; HINWEIS: Typen wie TRect oder TPoint brauchen Sie nicht zu deklarieren, sie werden von Delphi bereitgestellt! Sie können die Zuweisung der Einzelwerte für das Rechteck vereinfachen, wenn Sie die Funktion Bounds verwenden. var rec: TRect; ... rec := Bounds(40,40,100,100); Canvas.TextRect(Rec,10,10,'Hallo');

TextWidth und TextHeight Beide Methoden erlauben das Feststellen von Breite und Höhe eines auszugebenden Strings. Canvas.TextWidth(text:String):Integer Folgende nutzerdefinierte Methode, die Sie der Typdeklaration des Formulars hinzufügen, erlaubt das exakte Positionieren eines auszugebenden Textstrings in Formularmitte. procedure TForm1.zentriereText(txt: String); var x,y: Integer; begin x := (ClientWidth - Canvas.TextWidth(txt)) div 2; y := (ClientHeight - Canvas.TextHeight(txt)) div 2; Canvas.TextOut(x, y, txt) end; HINWEIS: TextWidth liefert denselben Wert zurück wie der Aufruf von TextExtent(Text).cx. Analoges gilt für TextHeight und TextExtend(Text).cy.

Page 12: Das Canvas-  · PDF fileKoordinatensystem In einem Delphi-Programm beziehen sich Koordinaten stets auf ein bestimmtes Objekt, d.h. auf ein Formular, auf eine Komponente oder auf

Fontabmessungen Die Texthöhe in Pixeln können Sie auch mit Font.Height ermitteln:

In einigen Fällen ist es allerdings günstiger, die Texthöhe in Punkten anzugeben. Verwenden Sie dazu die Eigenschaft Font.Size. Zuweisen der Schriftkonstanten Möchten Sie gezielt Schriftoptionen wie fett, kursiv etc. setzen, hilft Ihnen die Eigenschaft Style weiter: Schriftart auf fett und kursiv festlegen Canvas.Font.Style := [fsBold, fsItalic];