Exakte Textbreite berechnen
-
Hallo Community.
Ich habe folgendes Problem.
Ich habe ein Image , auf dem ich einen Text ausgebe.
Und ich will das Image, auf dem ich auch einen 4-Eck drum rum zeichne.
Nur so breit machen wie die Schrift breit ist.Ich habe hierzu Canvas->TextWidth verwendet. Nur dann ist mir aufgefallen
bei relativ kleinen Ausdrücken wie "aus" oder"ein" ist die Breite so klein das die Schrift über den Rand geht , also folglich abgeschnitten wird.Dann habe ich mir gedacht, leg ein temporäres Label an weis im die Schriftart und Größe zu und nimm dann die Label->Width her, um zu Zeichnen.
Hier jedoch ist das ganze an sich recht knapp bemessen.Habe mal verglichen z.B. der Buchstabe "w"
mit TextWidth = 10
mit LabelWidth = 8Und irgendwie komm ich so nicht auf nen grünen Zweig.
Einmal is zuviel Platz, das andere mal zu wenig, wenns lange Ausdrücke sind.Jemand Erfahrungen damit?!
mfg
Alex
-
Und Du verwendest auch die Standardschrift MS Sans Serif? Wenn nicht, musst Du dem Canvas natürlich mitteilen, welche Schrift, welche Größe und welchen Style Du verwendest (siehe TCanvas::Font).
-
Nein ich verwende Arial.
Aber das Habe ich dem Canvas mitgeteilt.
dennoch folgt die Ausgabe wie beschrieben.Bei langen Texten zu breit
bei kurzen zu kurz
also auf TextWidth bezogenint iTextW; int iLinieW; canvas->Font->Name = "Arial"; canvas->Font->Size = FFontSizeCanvas; iTextW = canvas->TextWidth(FText); iLinieW = canvas->TextWidth(Linie + Ust + DP); Picture->Bitmap->Width = Width; Picture->Bitmap->Height = Height; //mit neuer Größe anlegen canvas->Brush->Color = clWhite; canvas->Pen->Width = 1; canvas->Pen->Color = clBlack; canvas->Rectangle(0,0,Width, Height); canvas->Brush->Color = FFarbe; canvas->Pen->Width = 1; canvas->Pen->Color = clBlack; canvas->Rectangle(0,0,Width,Height); canvas->Font->Size = FFontSizeCanvas; canvas->Font->Color = FFontColor; canvas->Font->Name = "Arial"; AdvTextOut(FText, canvas, 2 , Height - 1 , FFontSizeCanvas, 90);
canvas = Picture->Bitmap->Canvas;
Ja so ist das leider
-
Das Windows PSDK hat eine Funktion GetTextExtentPoint32:
AnsiString s = "Tralala"; SIZE Extent; GetTextExtentPoint32( Canvas->Handle, s.c_str(), s.Length(), &SIZE );
-
Ist das diese AdvTextOut?
Könnte durchaus ein Rundungsproblem dieser Funktion sein...