Fensterhöhe berechnen
-
Hallo!
Ich hänge gerade irgendwie auf dem Schlauch. Ich möchte die Höhe für ein Fenster berechnen. Das Fenster soll wie folgt aussehen.
-------------------------- | | | Überschrift (1) | | | | Hier steht Text (2) | --------------------------Je nachdem wie breit die Überschrift ist, ergibt sich die Fensterbreite.
Der Text (2), kann beliebig lang sein und wird dann ggf. umgebrochen. Hier überlege ich schon die ganze Zeit wie ich aus der Textlänge (ggf. mit Umbruch) die Höhe errechnen kann.Folgende Funktion errechnet die Buchstabenbreite
void GetCharSize(::CDC *pDC, ::CFont *pFont, ::SIZE &Size) { ::CFont *pOldFont = pDC->SelectObject(pFont); Size = pDC->GetTextExtent("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 52); Size.cx = static_cast<long>(ceil(static_cast<float>(Size.cx) / static_cast<float>(52))); pDC->SelectObject(pOldFont); }Abstand von oben zur Überschrift sind 9. Zwischen 1 und 2 sind 20 und Abstand von 2 nach unten 5. Daraus ergibt sich schon mal 34.
-
DrawText mit DT_CALCRECT schon mal verwendet?
-
Martin Richter schrieb:
DrawText mit DT_CALCRECT schon mal verwendet?
Ja, das hilft zwar, aber ist die Höhe dann nicht immer gleich.
-
Ich verstehe nicht ganz was Du möchtest.
Du hast evtl. auch DT_CALCRECT für mehrere Zeilen nicht ganz verstanden. DT_CALCRECT passt die Höhe an die gegebene Weite an.
Bestimme die längste Zeile. Das geht sehr einfach auch mit DT_CALCRECT und DT_SINGLELINE.
Dann erzeuge ein Rechteck und setze die rechte Seite auf den maximalen Wert. Nochmal DT_CALCRECT anschmeissen dann hast Du die maximale Breite ohne Umbruch und die entsprechende Höhe.
-
Martin Richter schrieb:
Ich verstehe nicht ganz was Du möchtest.
Du hast evtl. auch DT_CALCRECT für mehrere Zeilen nicht ganz verstanden. DT_CALCRECT passt die Höhe an die gegebene Weite an.
Bestimme die längste Zeile. Das geht sehr einfach auch mit DT_CALCRECT und DT_SINGLELINE.
Dann erzeuge ein Rechteck und setze die rechte Seite auf den maximalen Wert. Nochmal DT_CALCRECT anschmeissen dann hast Du die maximale Breite ohne Umbruch und die entsprechende Höhe.Die Weite ist breits zur Höhenbestimmung bestimmt.
pToolBarItem->m_Width = max((pToolBarItem->m_Text.size() * Size.cx), 150); // Size.cx enthält die Daten aus GetCharSize(...)Mir fiel allerdings gerade auf, dass es doch tatsächlich Fälle gibt, in denen zwar der TitelText kleiner als der Text ist, aber beides kleiner als die Mindestbreite.

-
Und warum hilft Dir DT_CALCRECT nun nicht?
-
Martin Richter schrieb:
Und warum hilft Dir DT_CALCRECT nun nicht?
Sorry. Jetzt hilft es nachdem ich den beschriebenen Fall einbeziehe.