Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Canvas.TextOut zentrieren (https://www.delphipraxis.net/165093-canvas-textout-zentrieren.html)

Nicodius 14. Dez 2011 17:45

Canvas.TextOut zentrieren
 
Hallo Leute,

ich würde gerne eine Ausgabe per TextOut auf dem Form zentrieren.
Delphi-Quellcode:
x := Form1.Width div 2 - (Canvas.TextWidth(text) div 2);
kommt bei der Schriftgröße schon einigermaßen hin, aber bei manchen texten hängt es.
Habt ihr da vl eine schöne Lösung oder irgendwelche Parameter die ich hier gebrauchen könnte?

lg Nico

Nicodius 14. Dez 2011 17:52

AW: Canvas.TextOut zentrieren
 
sorry alter code
Delphi-Quellcode:
x := round((Form1.Width - Canvas.TextWidth(text)) / 2);
ist der aktuelle. Leider genau das gleiche problem.
canvas.TextOut(round((form1.ClientWidth - canvas.TextWidth('ZENTRIERT')) / 2),200,'ZENTRIERT');
von http://www.delphipraxis.net/2634-tex...usrichten.html
bringt leider nicht das gewünschte ergebnis

EDIT: Das Problem scheint nur bei bold texten zu bestehen. da geht anscheinend die textwidth nicht richtig drauf?

DeddyH 14. Dez 2011 17:53

AW: Canvas.TextOut zentrieren
 
IMHO geht das mit MSDN-Library durchsuchenDrawText wesentlich einfacher.

Bummi 14. Dez 2011 18:07

AW: Canvas.TextOut zentrieren
 
Delphi-Quellcode:
var
 r:TRect;
 s:String;
begin
  r.Left := 0;
  r.Top := 0;
  r.Right := 300;
  r.Bottom := 100;
  s := 'Testtest';
  Canvas.TextRect(r,s,[tfVerticalCenter,tfCenter,tfSingleLine]);
end;

Nicodius 14. Dez 2011 18:36

AW: Canvas.TextOut zentrieren
 
Hi! Vielen Dank für eure Antworten,

beide Möglichkeiten scheinen aber Formatierungen wie bold/underline nicht zuzulassen oder?

lg Nico

stahli 14. Dez 2011 18:43

AW: Canvas.TextOut zentrieren
 
Du musst vorher Canvas.Font.Style einstellen.

Nicodius 14. Dez 2011 18:46

AW: Canvas.TextOut zentrieren
 
Ah schon müde :)
Danke für die Antwort, gerade selber gesehen dass das eh ganz normal über die Canvas lauft.

Vielen Dank erstmal an alle!

lg und einen schönen Abend


Nico

Nicodius 14. Dez 2011 18:56

AW: Canvas.TextOut zentrieren
 
@Bummi, das ist leider mit Delphi 7 nicht möglich, da ist die Graphics wohl aufgewertet worden.

ASM 14. Dez 2011 22:41

AW: Canvas.TextOut zentrieren
 
Zitat:

Zitat von Nicodius (Beitrag 1141416)
das ist leider mit Delphi 7 nicht möglich, da ist die Graphics wohl aufgewertet worden.

Ja leider. Die Möglichkeit zur Übergabe der Formatierung ist erst in den neueren Delphiversionen durch Overload-Prozeduren vorhanden.

Man kann sich das aber für Delphi 7 leicht selber zusammenbauen:
Code:
procedure TextOutEx(canvas: TCanvas; r: TRect; s: string; Font: TFont = nil);
var
  x, y: integer;
  StringWidthInPixel, StringHeightInPixel: integer;
begin
  if Font <> nil then Canvas.Font := Font;
  StringWidthInPixel := Canvas.Textwidth(s);
  StringHeightInPixel := Canvas.Textheight(s);
  with r do
  begin
    x := (right - left - StringWidthInPixel) div 2;
    y := (bottom - top - StringHeightInPixel) div 2;
  end;
  Canvas.TextOut(x, y, s);
end;
In der Anwendung:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  r: TRect;
  Font: TFont;
begin
  // hier ist der Canvas der eines TImage
  r:=Image1.ClientRect;
  // falls benötigt:
  Font := TFont.Create;
  try
    with Font do
    begin
      color := clRed;
      Style := [fsbold, fsItalic];
      size := 14;
    end;
    // oder Font als Parameter weglassen, falls nichts Spezielles gewünscht
    TextOutEx(Image1.canvas, r, 'Test-Test', Font);
  finally
    Font.Free;
  end;
end;

Nicodius 15. Dez 2011 08:30

AW: Canvas.TextOut zentrieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Erstens: Vielen Dank für eure Bemühungen.

Hab es jetzt auch mit deiner Methode probiert asm aber leider kommt folgendes heraus(Anhang)

Der Bold Text wird verschoben, da kommt anscheinend das Textwidth nicht zusammen, kann das sein?

lg Nico

DeddyH 15. Dez 2011 08:48

AW: Canvas.TextOut zentrieren
 
Also bei mir sieht das hier ganz ordentlich aus:
Delphi-Quellcode:
procedure TFormTest.FormPaint(Sender: TObject);
const
  DRAWFLAGS = DT_SINGLELINE or DT_CENTER or DT_VCENTER;
  YOffset = 35;
var
  s: string;
  R: TRect;
  OldFont: TFont;

  procedure DrawRect;
  begin
    R.Top := R.Top + YOffset;
    R.Bottom := R.Bottom + YOffset;
    DrawText(Canvas.Handle, PChar(s), -1, R, DRAWFLAGS);
  end;

begin
  OldFont := TFont.Create;
  try
    //alten Font sichern
    OldFont.Assign(Canvas.Font);
    R := Rect(0, 0, ClientWidth, YOffset);
    s := 'Erste Zeile';
    DrawRect;
    Canvas.Font.Size := 14;
    Canvas.Font.Style := [fsBold];
    s := 'Zweite Zeile';
    DrawRect;
    Canvas.Font.Size := 12;
    Canvas.Font.Style := [fsBold, fsItalic];
    s := 'Dritte Zeile';
    DrawRect;
    Canvas.Font.Size := 20;
    Canvas.Font.Name := 'Times New Roman';
    Canvas.Font.Style := [fsItalic];
    s := 'Vierte Zeile';
    DrawRect;
    //Gesicherten Font wiederherstellen
    Canvas.Font.Assign(OldFont);
  finally
    OldFont.Free;
  end;
end;

Nicodius 15. Dez 2011 09:10

AW: Canvas.TextOut zentrieren
 
Danke DeddyH! Das hat prima funktioniert.

Würde mich trotzdem itneressieren warum das TextWidth mit dem fsbold nicht umgehen kann.

lg Nico

DeddyH 15. Dez 2011 09:13

AW: Canvas.TextOut zentrieren
 
Das kann ich aus dem Hut leider auch nicht sagen. Evtl. bringt ein Blick in die Delphi-Sourcen Licht ins Dunkel.

Bummi 15. Dez 2011 09:23

AW: Canvas.TextOut zentrieren
 
kann es sein dass Du TextWidth nicht neu berechnen lässt nach der Umstellung auf Bold ?

FrankJ28 15. Dez 2011 09:30

AW: Canvas.TextOut zentrieren
 
Vielleicht ein Reihenfolgeproblem,
erst Bold, dann TextWidth setzen?
Ciao
Frank

EDIT: Thomas war schneller

DeddyH 15. Dez 2011 09:34

AW: Canvas.TextOut zentrieren
 
Wenn er ASMs Code 1:1 übernommen hat, kann es daran ja eigentlich nicht liegen, da dort der Font erzeugt, übergeben und anschließend ausgewertet wird.

Nicodius 15. Dez 2011 10:46

AW: Canvas.TextOut zentrieren
 
Nein wurde zuerst bold gesetzt und dann berechnet. Wirklich seltsam.

mz23 22. Mär 2012 17:55

AW: Canvas.TextOut zentrieren
 
Zitat:

Zitat von Nicodius (Beitrag 1141545)
Nein wurde zuerst bold gesetzt und dann berechnet. Wirklich seltsam.

Vielleicht hat der Canvas nicht mehr dieselbe Breite nach dem Style
setzen?!

Nur Vermutung:
Image1.Picture.Graphic.Width := Image1.Width;
Image1.Picture.Graphic.Height := Image1.Height;
neu setzen.

Schöne Grüße aus Nürnberg,
Manfred

DeddyH 22. Mär 2012 18:08

AW: Canvas.TextOut zentrieren
 
Wieso Image? Er hat doch direkt auf das Formular gezeichnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz