Textlänge in einem TButton ermitteln



  • Kann doch nicht sein.
    Wenn ich im TButton einen anderen Font benutze ist ja automatisch MButton->ParentFont=false, so dass ein Durchgriff ja gar nicht mehr möglich ist.



  • Ja, das geht natürlich.
    Hatte nur gehofft, man kann das ganze einfacher lösen.



  • Hallo,

    kan man auch. Der Ansatz von Linnea ist absolut korrekt und muss nur um eine zeile erweitert werden.

    String Capt = Button1->Caption; 
    Canvas->Font = Button->Font;
    int breite = Canvas->TextWidth(Capt); 
    int Rand = 20; 
    Button1->Width = breite + Rand;
    

    ggf. kann man den alten Font temporär zwischenspeichern um ihn danach zurückzusetzen...

    LG



  • MyOwnShadow schrieb:

    da ich im Button eine andere Schriftgröße verwende, ggf. sogar einen ganz anderen Font.

    dann wirst du um etwas grösseren Aufwand nicht herumkommen. Da ja der Button kein Canvas hat,
    bekommt er eins:

    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
        // Button3 ist Test-Button
        TCanvas* cv  = new TCanvas;             // Canvas erzeugen
        cv->Handle   = GetDC(Button3->Handle);
        cv->Font->Assign(Button3->Font);        // Font zuweisen
    
        //--------  Kontrolle  -----------
        char szFaceName[40];
        GetTextFace( cv->Handle, 39, szFaceName );
        //--------  /Kontrolle  ----------
    
        TEXTMETRIC tm;               // hier stehen noch mehr brauchbare Parameter drin
        GetTextMetrics( cv->Handle, &tm );
        int w = tm.tmAveCharWidth;
        int len = Button3->Caption.Length();
    
        Label1->Caption = "Caption vom Button3 ist " + IntToStr( w * len ) + " Pixel breit";
    
        delete cv;   // Canvas löschen
    }
    //---------------------------------------------------------------------------
    

    So sollte es mit versch. Fonts gehen.

    mfg
    kpeter



  • Danke für die Ideen, dann werde ich mich einmal an die Arbeit machen ...



  • Noch ein Nachsatz:

    obiger Code ist geeigneter für Fonts mit fester Zeichenbreite.
    Ansonsten aus der Struktur TEXTMETRIC weitere Parameter auswerten.

    mfg
    kpeter



  • Hallo,

    eine kürzere, Variante :

    TCanvas* cv  = new TCanvas;             // Canvas erzeugen
       cv->Handle   = GetDC(Button3->Handle);
       cv->Font->Assign(Button3->Font);        // Font zuweisen
    
       SIZE size;
       GetTextExtentPoint32( cv->Handle, Button3->Caption.c_str(), Button3->Caption.Length(), &size );
       Button3->Width  = size.cx;
       Button3->Height = size.cy;
    
       delete cv;
    


  • Die Version gefällt mir sehr gut. 👍



  • Wenn man sich schon einen Canvas erzeugt, warum dann nicht auch die bereits erwähnten Canvas-Properties bzw. Member verwenden?
    Ist funktionell zwar kein Unterschied, sieht aber besser aus.

    ...
       tagSIZE ts = cv->TextExtent(Button3->Caption);
       Button3->Width  = ts.cx;
       Button3->Height = ts.cy;
       ...
    

    PS.: Oder doch gleich ohne Canvas:

    SIZE size;
       GetTextExtentPoint32( GetDC(Button3->Handle), AnsiString(Button3->Caption).c_str(), Button3->Caption.Length(), &size );
       Button3->Width  = size.cx;
       Button3->Height = size.cy;
    

    PPS.: Variante 2 funktioniert wohl wieder nur mit FixedWidth-Fonts ...



  • Hallo Jansen.

    das ist ja der Witz an der Sache.
    Über den Device Context bekommst du einen anderen Font übergeben : System Font



  • Jo.

    TCanvas::TextExtent ist übrigens doch nicht nur netter anzusehen, man vermeidet bei den modernen, standardmässig auf Unicode eingestellten BCB-Versionen auch den Stolperstein wchar_t* vs. const char* im API-Aufruf.


Anmelden zum Antworten