Discussion:
DrawTextEx
(zu alt für eine Antwort)
Jens Köhler
2017-09-20 17:33:45 UTC
Permalink
Hallo,

ich versuche, Text in einzelnen Rechtecken auszugeben.
Dazu wollte ich DrawTextEx verwenden, da dieses zurückgeben soll,
wieviel Text in das Rechteck paßt.
Das scheint nicht so richtig zu funktionieren.
Ohne DT_WordBreak wird der komplette Text ausgegeben? von dem man aber
nur das Stück im Rechteck sieht.
Mit DT_WordBreak wird nur das ausgegeben, was auch ins Rechteck paßt,
aber nur, wenn das Rechteck so niedrig ist, das die Unterlänge vom g
schon abgeschnitten wird. Ansonsten wird eine nicht sichtbare 2. Zeile
ausgegeben und vom nachfolgenden Text fehlt diese.
Ist das so eine "Lass es und machs lieber selbst"-Funktion oder was
mache ich falsch bzw. wie mach ich es Richtig?

D5 unter WinXP

ps: ich habe eine Funktion, die mir den Text zerschnipselt, aber ich
dachte, wenn es eine Funktion gibt, die das in einem Rutsch erledigt,
kann ich die auch nehmen.

procedure TForm1.Button1Click(Sender: TObject);
var
Text, s : String;
LineHeight,
TxLen,
x : integer;

R : TRect;
Dtp : TDrawTextParams;
Flags : DWord;
begin
Canvas.Font.Size := 12;
Canvas.Font.Name := {'Courier';//}'Arial'; // 'Dauphin';}
'CroissantD';
Canvas.Font.Color := clBlue;
Canvas.Brush.Style := bsClear;

LineHeight := Canvas.TextHeight('Äg');
// LineHeight := round(LineHeight * 1.2);

Text := 'Äg Das ist ein Text, der auf ein paar Rechtecke verteilt
werden soll.';

R := Rect(30, 30, 130, 30+LineHeight-1);

// Canvas.Rectangle(R);

FillChar(Dtp, SizeOf(Dtp), 0);
Dtp.cbSize := SizeOf(Dtp);

Flags := DT_Left or DT_NoPrefix{;// or DT_SINGLELINE;//} or
DT_WordBreak;
TxLen := length(Text);

x := DrawTextEx(Canvas.Handle, @Text[1], TxLen, R, Flags, @Dtp);
//PChar(Text)

// Rest und Daten ausgeben
s := trim(copy(Text, Dtp.uiLengthDrawn, MaxInt));
Canvas.TextOut(30, 60, s);
Label1.Caption := IntToStr(Dtp.uiLengthDrawn);
Label2.Caption := IntToStr(TxLen);
end;
Achim Kalwa
2017-09-20 18:14:47 UTC
Permalink
Moin,
Post by Jens Köhler
ich versuche, Text in einzelnen Rechtecken auszugeben.
Dazu wollte ich DrawTextEx verwenden, da dieses zurückgeben soll,
wieviel Text in das Rechteck paßt.
Das scheint nicht so richtig zu funktionieren.
Ohne DT_WordBreak wird der komplette Text ausgegeben? von dem man aber
nur das Stück im Rechteck sieht.
Mit DT_WordBreak wird nur das ausgegeben, was auch ins Rechteck paßt,
aber nur, wenn das Rechteck so niedrig ist, das die Unterlänge vom g
schon abgeschnitten wird. Ansonsten wird eine nicht sichtbare 2. Zeile
ausgegeben und vom nachfolgenden Text fehlt diese.
Ist das so eine "Lass es und machs lieber selbst"-Funktion oder was
mache ich falsch bzw. wie mach ich es Richtig?
Versuche es mal mit DT_NOCLIP als zusätzliches Flag. Dann sieht das bei
mir so aus:
Loading Image...

HTH
Achim
Jens Köhler
2017-09-20 18:53:30 UTC
Permalink
Post by Achim Kalwa
Moin,
Post by Jens Köhler
ich versuche, Text in einzelnen Rechtecken auszugeben.
Versuche es mal mit DT_NOCLIP als zusätzliches Flag. Dann sieht das bei
https://pasteboard.co/GLh8EaB.png
HTH
Achim
Ja, bei mir auch. Aber der Text soll auf mehrere Rechtecken verteilt
werden. In der Demo ist nur das 1. drin und der Rest wird einfach
darunter geschrieben. Dazu muß ich aber wissen, wieviel Text in das 1.
(und dann natürlich jedes Weitere) gepasst hat.
Und da klemmt es dann.

Jens
Jens Köhler
2017-09-21 15:47:16 UTC
Permalink
Am 20.09.2017 um 19:33 schrieb Jens Köhler:

ich habe mal 2 Bildschirmfotos gemacht.
Loading Image...

links sieht mann in der Unterkante der Rechtecken die Zipfel der
Buchstaben. Diese 2. Zeile pro Rechteck gehört da nicht hin und der Text
fehl dann natürlich in den sichtbaren Bereichen. Rechts ist der Text wie
er sein soll, nur muß man Die Rechtecken so klein machen, das die
Unterlängen (vom g) schon abgeschnitten sind.

Damit ist DrawTextEx, zumindest für meine Zwecke, wohl ungeeignet.

Jens

Loading...