Mit Blocksatz auf TLabel schreiben
-
Hallo zusammen,
ich habe ein Label mit der Eigenschaft WordWrap = true. Nun möchte ich mit Blocksatz darauf schreiben. Gibt es da eine Möglichkeit oder muss ich das selbst mühsam mit \n machen?Danke
-
Blocksatz musst Du schon selbst implementieren, das kann ein Label nicht. Allerdings ist das schon ein bißchen mehr Arbeit, als nur ein paar Zeilenumbrüche zu machen, zumindest so lange Du die Standardschrift verwendest. Mit Zeilenumbrüchen funktioniert das nur, wenn Du eine Schriftart mit fester Zeichenbreite verwendest.
Vielleicht gibt es ja was in der WinAPI...
-
Ich meine bei TLabel kann man mit der Eigenschaft Alignment rumspielen, dann wird der Text link-rechts-mittig positioniert.
Setze zuerst die Eigenschaft AutoSize=false
dann ziehe das TLabel etwas auseinander und
setze Alingment=taCenter.
ggf. noch mit WordWrap rumspielen.Gruß Hawk
-
Sorry, habe es missverstanden.
Blocksatz geht nicht so einfach, da hat Joe_M schon recht, da musst du mit der WinAPI rumspielen, fange am besten mit den WM-Messages eines Labels an, oder mit SetWindowLong.
-
EDIT: Hat sich schon erledigt...
-
Hawkxxx schrieb:
da musst du mit der WinAPI rumspielen, fange am besten mit den WM-Messages eines Labels an, oder mit SetWindowLong.
Messages brauchts nich...
zum Ziel gehts mit
Win-Api : SetTextJustification
-
Danke schonmal! Und wie würde ein Beispielaufruf von SetTextJustification aussehen?
-
Hi,
im meinem Beispiel werden die Strings aus einem Memo ausgelesen, für den Blocksatz formatiert und auf ein Panel
gezeichnet:void __fastcall TForm1::Button2Click(TObject *Sender) { HWND hWnd = Panel1->Handle; HDC hDC = GetDC( hWnd ); int yline = 10; for ( int i = 0; i < Memo1->Lines->Count; i++ ) { String Txt = Memo1->Lines->Strings[i]; SIZE size; int spaces = 0; bool getTEP32 = GetTextExtentPoint32( GetDC(Memo1->Handle), Txt.c_str(), Txt.Length(), &size ); for ( int j = 1; j < Txt.Length(); j++) { if ( Txt[j] == ' ') spaces++; } SetTextJustification( hDC, Panel1->Width - 20 - size.cx, spaces ); TextOut( hDC, 5, yline, Txt.c_str(), Txt.Length() ); yline += 15; } }
Mit einem TLabel wirds so nicht gehen.
TODO: Schriftfont und Hintergrundfarbe der Schrift anpassen.mfg
kpeter
-
Hallo,
muss noch ein Posting nachsenden.
Mit einem cast auf das Canvas eines TLabels ist auch dieses bereit, Blocksatz darzustellen.
Der darzustellende Text kann natürlich aus einem Array o.ä. geladen werden.Naja, das ganze wäre ein Anlass, um eine entsprechende eigene Komponente zu schreiben;
mE. hat keine der BCB-Kompos eine Textausrichtung im Block...void __fastcall TForm1::btn1Click(TObject *Sender) { TCanvas* cv = dynamic_cast<TCanvas*>(Label1->Canvas); int yline = 10; for ( int i = 0; i < Memo1->Lines->Count; i++ ) { String Txt = Memo1->Lines->Strings[i]; SIZE size; int spaces = 0; // Ermitteln der Leerzeichen GetTextExtentPoint32( cv->Handle, Txt.c_str(), Txt.Length(), &size ); for ( int j = 1; j < Txt.Length(); j++) { if ( Txt[j] == ' ') spaces++; } int dist = 20; // Seitendistanz, margin; ausprobieren SetTextJustification( cv->Handle, Label1->Width - dist - size.cx, spaces ); TextOut( cv->Handle, 5, yline, Txt.c_str(), Txt.Length() ); yline += 15; // Zeilendistanz } }
edit Kommentare
mfg
kpeter