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 = 8

    Und 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 bezogen

    int 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...


Anmelden zum Antworten