Textbreite im Richedit in Pixel
-
Hi,
ich habe folgendes Problem. Ich möchte den Text aus einem Richedit auf einen Canvas übertragen. Dazu ist es notwendig die Textbreite aus dem Richedit in Pixel zu kennen.
Kann mir vielleicht jemand einen Tip geben, wie ich die Breite bekomme?
Danke euch!
-
int __fastcall TextWidth(const AnsiString Text);
-
danke aber das liefert mir nur die breite bei einem bestimmten font (du hast im forum hierzu beriets eine frage gestellt, die ich mir auch durchgelesen habe). innerhalb eines richedits kann es aber pro zeile verschiedene fonts geben(rtf!). daher nützt mir dies nicht viel.
ich kann natürlich jede zeile durchgehen und die breite überprüfen, was aber viel zu lange dauern würde (und auch nervig ist, da ich nicht jedes einzelne ziechen anfassen will). gibt es dafür denn keine funktion?
für weitere anregungen wäre ich sehr dankbar.
-
Dann erzeug Dir einen TCanvas, stell die gewünschte Schriftart und -größe ein und verwende TCanvas::TextWidth().
-
Joe_M. schrieb:
Dann erzeug Dir einen TCanvas, stell die gewünschte Schriftart und -größe ein und verwende TCanvas::TextWidth().
Problem bleibt da ich mehrere Fonts haben kann! Ich glaube das Problem ist nicht so einfach. Ich will das ganze halt nicht unbedingt von Hand machen...
-
Da ich keine Lösung gefunden habe, habe ich das eben selbst geschrieben. Allerdings (!) ist das eine unelegante und naive Lösung. Ich hätte gerne etwas schnelleres und vorallem sauberes. Vielleicht hat jemand einen Tip:
void richedit_extent(TRichEdit *re,TCanvas *canvas,int &width,int &height) { width = height = 0; int w(0),h(0); for (int i(0);i<re->Text.Length();++i) { re->SelStart = i; re->SelLength = 1; canvas->Font->Assign(re->SelAttributes); w += canvas->TextWidth(re->SelText); h = max(h,canvas->TextHeight(re->SelText)); if (re->Text[i+1] == '\n') { width = max(w,width); w = 0; height += h; if (!h) { canvas->Font->Assign(re->DefAttributes); height += canvas->TextHeight(" "); } h = 0; } } if (re->Text[re->Text.Length()] != '\n') { height += h; if (!h) { canvas->Font->Assign(re->DefAttributes); height += canvas->TextHeight(" "); } } }
-
Hat denn keiner einen Vorschlag oder Hinweis für mich?
-
wozu dient der spass?
willst du ein bitmap haben, dann gugge hier.
-
Sunday schrieb:
wozu dient der spass?
willst du ein bitmap haben, dann gugge hier.
Also ich will eine Art Textverarbeitung erstellen. Hierfür habe ich eine Textblockfunktion. Der User gibt einen Text in einem Richedit ein, kann diesen formatieren und platziert diesen auf einen Canvas. Das Problem hierbei, der Text im Richedit in einer Zeil hat natürlich je nach Formatierung und Zeilenlänge eine bestimmte Breite. Diese benötge ich, um den Text auf dem Canvas auch so darzustellen, wie er eingegeben wurde. Das Problem ist also nicht, das Bitmap zu erstellen. Das funktioniert ja auch.
Nur wollte ich eine schönere Lösung finden als die die ich oben gepostet habe. Eigentlich geht es mir hier speziell um die Performance! Dein Link bringt mir also nicht viel, da das Problem damit nicht behoben wird.
Trotzdem Danke!