Textlänge in einem TButton ermitteln
-
Hallo !
Ich möchter gerne die Breite eines TButton, entsprechend der Textlänge anpassen.
Die Komponente bietet wir aber nur GetTextLen() an, also die Anzahl der Zeichen.Einen Canvas, wo ich mittels TextWidth() die Breite ermitteln könnte hat er nicht.
Was kann ich tun ?Vielen dank.
-
du kannst doch trotzdem TextWidth verwenden, einfach mit dem Canvas des Forms:
String Capt = Button1->Caption; int breite = Canvas->TextWidth(Capt); int Rand = 20; Button1->Width = breite + Rand;
Rand mußt du selbst festlegen, da sonst der Button wirklich nur so breit wie der Text wird
-
Diesen Ansatz hatte ich auch im Auge.
Das funktiopniert aber leider nicht, da ich im Button eine andere Schriftgröße verwende, ggf. sogar einen ganz anderen Font.
-
Und wenn du mit TCanvas::Font diesen zuerst auf bold setzt? Wird dann das ganze Form fettgedruckt?
-
Man könnte sich auch ein unsichtbares Image erzeugen. Da hat man Zugriff auf das Canvas und kann auch den Font beliebig setzen.
-
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.