[C++] "Multicolor-Textfeld", optimale Breite für ein Textfeld ermitteln?

WantToKnow

Mitglied
Guten Abend,

Ich werde versuchen mein Problem leichtvestandlich zu beschreiben.

Es ist eine dialogbasierende Anwendung mit Unterstützung von MFC
unter MS Visual 6.0 C++ (OS Windows).


In einem CString Objekt befindet sich eine beliebige Zeichenfolge.

Dieser String soll in einem einfachen Textfeld (vom Typ CStatic)
mit optimaler Breite ausgegeben werden, wobei die Höhe unrelevant ist.

Mein Problem ist, dass ich überhaupt keine Vorstellung habe, wie
die optimale Breite für das Textfeld anhand eines beliebigen Strings
ermittelt werden könnte.


Aber vielleicht könnt ihr mir auch helfen das ursprünglichen Problem
ohne diesen Umweg zu lösen.

Das eigentliche Problem war ein von mir ausgedachtes "Multicolor-Textfeld",
so dass ich bestimmte Textteile eines String in verschiedenen Farben
ausgeben könnte. Soweit ich informiert bin, gibt es unter MFC keine
vorgefertigten Funktionen/Methoden dafür.

Weiterhin dachte ich, dass ich aus einzelnen Textfeldern, die mit verschiedenen
Textfarben belegt sind, diese derart kaskadieren könnte, so dass diese
wie ein einzelnes Textfeld ausschauen würden. Daraus ergab sich mein zweites Problem.


Kleines Beispiel:

Textfarbe: | R | G | B |
Text: |MFC|ist|gut|
 
WantToKnow hat gesagt.:
Mein Problem ist, dass ich überhaupt keine Vorstellung habe, wie
die optimale Breite für das Textfeld anhand eines beliebigen Strings
ermittelt werden könnte.
Für das Berechnen der Textgröße benötigst Du einen Devicekontext (DC) mit den Eigenschaften des CStatic-Feldes. Am besten du legst erstmal das CStatic-Feld mit Höhe/Breite = 0 an, berechnest dann die Größe anhand des Textes und passt letztendlich die Feldgröße mit CWnd::SetWindowPos() an.
Die Berechnung der Größe erfolgt mit CDC::GetTextExtent():
Code:
CStatic wndStatic;  // Dein erzeugtes Static-Feld

CDC   *pDC      = wndStatic.GetDC();
CFont *pFont    = wndStatic.GetFont();
CFont *pOldFont = pDC->SelectFont(pFont);

CSize size = pDC->GetTextExtent(_T("String zum Testen"));
// size.x ... Breite
// size.y ... Höhe

pDC->SelectFont(pOldFont);
wndStatic.ReleaseDC(pDC);

WantToKnow hat gesagt.:
Weiterhin dachte ich, dass ich aus einzelnen Textfeldern, die mit verschiedenen
Textfarben belegt sind, diese derart kaskadieren könnte, so dass diese
wie ein einzelnes Textfeld ausschauen würden. Daraus ergab sich mein zweites Problem.
Wieso ergibt sich daraus ein Problem? Wenn Du die notwendige Breite bestimmt hast, kannst Du ja dann die Felder exakt positionieren.

Als Alternative zum Selbstbau eines Multicolor-Textfeldes würde sich noch die Verwendung des RTF-Controls anbieten, erfodert allerdings auch etwas Know-How für den gewünschten Anwendungszweck.

Gruß
MCoder
 
Hallo,
die Textlänge kannst du einfach mit der DrawText-Funktion ermitteln.
Dazu mußt du dir, wenn nicht schon geschehen, einen Zeiger auf den DC oder einen DC besorgen. Mit einem Zeiger funktioniert es so:
Code:
CRect rectDraw;
pDC->DrawText("Mein Text",rectDraw,DT_CALCRECT);
rectDraw wird durch die Funktion so verändert, daß genau der Text hineinpaßt, du kannst also über
Code:
int breite=rectDraw.GetWidth();
ganz einfach die Länge bestimmen. Genauso kannst du die Länge von Textteilen bestimmen und dann deine Static-Felder so positionieren und in der Größe anpassen, daß es so aussieht, wie du es haben willst.

Mfg

langer
 
Ihr seid meine Helden! :)

Also, dass es dann so einfach wird, konnte ich mir gar nicht vorstellen.
Das RichtEdit-Control wäre das richtige Stichwort gewesen. :-(
Für das Berechnen der Textgröße benötigst Du einen Devicekontext (DC) mit den Eigenschaften des CStatic-Feldes.
Zu Anfang dachte ich nur an die CWnd, CStatic und CString Klasse, um dieses Problem zu lösen.
Wieso ergibt sich daraus ein Problem? Wenn Du die notwendige Breite bestimmt hast, kannst Du ja dann die Felder exakt positionieren.
Mit dem zweiten Problem ist hier das erste Problem gemeint (optimale Breite),
Als Alternative zum Selbstbau eines Multicolor-Textfeldes würde sich noch die Verwendung des RTF-Controls anbieten, erfodert allerdings auch etwas Know-How für den gewünschten Anwendungszweck.
Vielen Dank, dass du mich auf das RTF-Control hingewiesen hast!
Ich werde es für meine Lösung benutzen. Das dafür nötige Know-How ist vorhanden.

Hallo,
die Textlänge kannst du einfach mit der DrawText-Funktion ermitteln.
Danke auch für deinen Lösungsvorschlang!
Diese Vorgehensweise kannte ich auch noch nicht. :)

Das RichEdit-Control macht das bestimmen der optimalen Breite sowie das
Kaskadieren der einzelnen Textfelder überflüssig.

Bin dennoch froh um dieses Wissen bereichert worden zu sein.

Großen Dank an euch beide nochmal! :)
 
Zurück