Objekt Grösse ermitteln

CodeFatal

Erfahrenes Mitglied
Abend zusammen,
Ich habe folgendes Problem:

Ich möchte den Inhalt eines CString Objektes in einem CStatic Feld anzeigen.
Dazu habe ich mir die nötigen Variablen und Zuordnungen erstellt.
Soweit klappt das auch alles. Das Problem ist jetzt aber, das ich nicht weiß wie lang dieser Text zur Laufzeit wird, ich aber eine Beschränkte Breite habe.

Um das ganze möglichst harmonisch wirken zu lassen möchte ich bei zulangem Text nur einen Teil in das CStatic schreiben und in der nächsten Zeile mit einem neuen CStatic weiter machen.

Wie bekomme ich heraus, wie gross das CStatic.Rect sein möchte, wenn der gesamte Text hinein kommt bzw. wieviel des Textes ich in ein bestimmtes Rect passt.

Funktionen wie Zeilen-Umbruch etc. kann ich aus anderen Gründen nicht nutzen.

Hab zwar schon das inet abgegrast, aber mal wieder Null brauchbare Treffer gehabt.
Vermutlich einfach mal wieder falsch gegoogelt.

Danke schon mal für eure Hilfe

Gruss Michael
 
Hi,

also in der MFC Klasse CDC bietet eine Methode:
Code:
BOOL GetTextMetrics(
LPTEXTMETRIC lpMetrics )
const;
Damit kannst du abhängig vom verwendeten Font die maximalen bzw. durchschnittlichen Zeichenbreiten erfahren.
Aber Vorsicht, das ändert sich, sobald du einen anderen Font verwendest, da die Fonts ja unterschiedliche Eigenschaften haben.

Daniel
 
Ich gehe mal davon aus, das du zumindest das erste CStatic-Feld schon erzeugt hast. Somit ist die maximale Textbreite bereits vorgegeben.
Von diesem CStatic-Feld besorgst du dir einen Device-Kontext (CDC) und kannst dann mit der Member Funktion
Code:
CSize GetTextExtent( const CString& str ) const;
die für deinen Text (Parameter "str") erforderliche Breite ermitteln.
Wenn's zu breit ist, musst du halt in einer Schleife den Text solange immer um ein Zeichen kürzen, bis es passt.
 
Moin Moin zusammen,

hört sich erstmal nicht schlecht an. ich glaub sowas such ich.
@MCoder ja die Static's sind alle erzeugt und werden entsprechend angezeigt, wieso ist die Textbreite bereits vorgegeben. kann doch ohne weiteres die Grösse ändern und dem entsprechend mehr Text aufnehmen. Der Clou soll ja auch sein, das ich an hand der Text länge die Grösse des Static feldes berechne und bei nem gewissen Grenzwert den text kürze und in der nächsten zeile vorführe... Geht im Endeffekt darum, Edit, Combo und sonst was Elemente fliessend in den Text einzubinden, Lückentext lässt grüssen:) Kann also die zu erwartende Länge ungefähr abschätzen. Sonst würd es auch keinen Sinn machen für jede Zeile nen Static zu nehmen... Dürfte bei nem Roman einiges an Speicher und Geschwindigkeit schlucken :)

Gruss Michael
 
Ach so, da habe ich wohl nicht so richtig gelesen :) .
Jedenfalls ändert sich am Prinzip nicht: Dann hast du die maximale Breite eben anhand deines übrigen Layouts festgelegt. Wichtig ist halt nur, dass der Device-Kontext den aktuellen Font des Zielfensters hat, damit die Berechnung mit GetTextExtent() richtig funktioniert.
 
Hi,
der Kommentar kam genau richtig, hat mir nen blödes Nachfragen erspart :), Hab mir sowas schon fast gedacht als ich mein Ergebniss gesehen hab. :) Aber was wird denn da dann genau übergeben, wenn ich noch andere wichtige sachen zufügen muss... wäre doch nicht schlecht, wenn deralle einstellungen meines devices übernimmt...

Gruss Michael
 
CodeFatal hat gesagt.:
Aber was wird denn da dann genau übergeben, wenn ich noch andere wichtige sachen zufügen muss... wäre doch nicht schlecht, wenn deralle einstellungen meines devices übernimmt...
Äh, wenn das jetzt deine Frage war, verstehe ich nicht was du meinst. :confused:
Was wird wem übergeben und welche wichtigen Sachen musst Du zufügen? Was ist denn bei deinem Ergebnis schiefgelaufen?
 
Hatte natürlich nicht die Font vom Static an das CDC übergeben und damit war die ermittelte grösse sogut wie nicht brauchbar. nach selektieren der Font klappt es aber wunderbar. :). Da man diesen Schritt aber noch manuell machen muss. ist für mich nicht ganz klar, was der wirklich aus dem Static an Informationen holt. Die Font müsste der doch auch bekommen können. Wenn ich das richtig in Erinnerung habe ist das doch nen Member von CWnd. Und davon bekommt das CDC doch schließlich seine Daten oder nicht?
Um Irrtümern vorzubeugen. Meine erste Frage ist beantwortet und in funktionierenden C-Code gegossen. Das jetzt ist sozusagen nur noch Weiterbildung...

Gruss Michael
 
Das sind so die kleinen Gemeinheiten der MFC, damit's nicht zu einfach wird. :)
Zumindest ein mit GetDC() bzw. GetWindowDC() geholter Device Context hat immer irgendeinen allgemeinen Systemfont ausgewählt, der natürlich nie passt. Ich erinnere mich jetzt, dass ich da auch schon mal drübergestolpert bin. Ist aber schon eine Weile her, hab ich wohl verdrängt ...
 
Zurück