33 Stimmen

Delphi: CanvasTextOut Ausrichtung: Align Left, Right and Center

Tipp von Delphianer | Letztes Update am 31.01.2023 | Erstellt am 13.02.2013

CanvasTextOut ist eine Delphi-Funktion, mit der wir einen Text auf ein Bitmap zeichen können. Unglücklicherweise unterstützt diese Funktion nicht unmittelbar eine Ausrichtung des Textes. Aus diesem Grund zeige ich euch in diesem Tip einen Workaround, wie ihr mit CanvasTextOut einen Text links, rechts oder zentriert ausrichten könnt.

Der Trick dabei: Wir bestimmen die Breite des Textes (Variable textbreite) und schauen, wie viel Platz für den Text insgesamt gegeben ist. Abhängig vom gewählten Alignment (im Beispiel durch die RadioButtons rb_alleft, rb_alright und rb_alcenter) berechnen wir die Variable align, die wir bei der Ausgabe des Textes zum Außenabstand hinzuzählen.

Hier ist der komplette Beispielcode:

procedure ...;
var
  zeilen: TStringList;
  i: integer;
  align, breite, hoehe, randlinks, randrechts, randoben, 
  zeilenabstand, position, textbreite: integer;
  bmp: TBitmap;
begin
  // Zeilen, die geschrieben werden
  zeilen:=TStringList.Create;
  zeilen.add('Das ist ein Text.');
  zeilen.add('Das ist eine weitere Zeile.');

  // Ränder und Abstände
  breite        := 300;
  hoehe         := 300;
  randlinks     := 10;
  randrechts    := 10;
  randoben      := 30;
  zeilenabstand := 40;

  // Bitmap erstellen
  bmp:=TBitmap.Create;
  bmp.Width  := breite;
  bmp.height := hoehe;

  // Text schreiben
  for i := 0 to length(zeilen) - 1 do
  begin
    // Ausrichtung
    textbreite:=CanvasTextWidth(bmp.Canvas, zeilen[i]);
    if rb_alleft.checked then
      align:=0;
    if rb_alright.checked then
      align:=breite-randlinks-randrechts-textbreite;
    if rb_alcenter.checked then
      align:=round((breite-randlinks-randrechts-textbreite)/2);

    // Zeilen schreiben
    position:=randoben+(i*zeilenabstand);
    CanvasTextOut(bmp.Canvas, randlinks+align, position, zeilen[i]);
  end;

  // Etwas mit dem Bitmap machen
  Image1.Picture.Bitmap:=bmp;

  // Freigeben
  zeilen.Free;
  bmp.Free;
end;

Zuerst fügen wir einige Zeilen zu einer Stringlist hinzu. Diese Zeilen sollen später ausgegeben werden. Danach legen wir alle Abstände und die Größe des Bitmaps fest (die Werte kann man frei verändern). Nachdem wir das Bitmap erzeugt haben, gehen wir alle Zeilen einzeln durch und bestimmen die Textbreite jeder Zeile. Anschließend legen wir den align-Wert jeder Zeile fest und schreiben jede Zeile auf die Bitmap.

AntwortenPositivNegativ

Über den Autor

AvatarDer Autor hat keine Kurzbeschreibung seines Profils angegeben.
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.