Schrifthoehe bestimmen ...
-
tester111 schrieb:
Ohne die Funktionen zu kennen: solltest du GetLogFont nicht besser die Adresse deiner LOGFONT-Struktur übergeben? Macht irgendwie Sinn, denke ich...
Macht er doch.
Nö, er übergibt den CFont-Zeiger, nicht den auf die LOGFONT-Struktur. Aber er hat ja schon eingeräumt, dass das ein Tippfehler war.
Daher ist es übrigens ratsam, immer den eigenen Code zu copy-pasten und nicht abzutippen. Dann passieren solche Fehlerchen nicht und verwirren niemanden.

So, turu's Tipp nochmal ausgeschrieben: Du musst deinen CFont-Zeiger auch auf NULL prüfen, wie im MSDN-Beispiel! Kann eigentlich nicht anders sein, dein Zeiger ist NULL (von GetFont zurückgegeben), somit hast du auch kein Objekt, für das du die Methode ausführen könntest...
-
Das Problem lag darin, dass ich VC 6.0 verwendet habe. Dann gibt nämlich
GetFont() eine NULL Wert zurück, sofern die Default-Schriftart eingestellt
ist. Wenn ich einen Font definiere gibt lfo.lfHeight allerdings einen
komischen Wert zurück. Immer einen negativen Wert z.B. -1 oder -26 jenachdem
was für eine Schrift-Hoehe definiert wurde. Ist da vielleicht ein besonderer
Map-Mode nötig ? Oder ist ein besonderes Koordinatensystem vonnöten ?
Da ich immer im Internet-Cafe ins Internet gehe, muss ich den Text eintippen.
Sorry ...
-
Lies die Doku zu LOGFONT und dan weißt Du auch das negative Werte einen Sinn machen:
http://msdn.microsoft.com/en-us/library/ms901140.aspx
-
Wie berechnet man dann die tatsächliche Schrifthoehe in Pixel ?
Kann man dies aus der Doku entnehmen ?
-
GeorgC++ schrieb:
Wie berechnet man dann die tatsächliche Schrifthoehe in Pixel ?
Kann man dies aus der Doku entnehmen ?Riskier doch mal einen Blick, dann findest du es heraus.

-
Für negative lfHeight's gilt folgende Gleichung;
lfHeigth = - (PointSize * GetDeviceCaps(LOGPIXELSY) ) / 72;
umgestellt gilt:
PointSize = - lfHeight * 72 / 96;
mit GetDeviceCaps(LOGPIXELSY) = 96;
Wenn ich einen Font mit Schriftgroesse 8 definiere, ergibt sich für
PointSize = 7.5
Wenn ich einen Font mit Schriftgroesse 20 definiere, ergibt sich für
PointSize = 19.5
Muss man hier aufrunden ?
Wie rundet man in C++ nocheinmal ?
Was berechnet denn GetDeviceCaps(...) ?
-
Wenn du deine Werte (z.B. 7.5) auf Ganzzahlen (kaufmännisch) runden willst, dann multiplizier mit 10, addiere 5 und dividiere wieder durch 10 (Ganzzahlendivision). Kann man prima in einer kleinen Funktion oder einem Makro unterbringen.
-
Weiss aber noch nicht, wann es positive bzw negative lfHeight's gibt und wie man dann PointSize berechnet. Und wie man vorgeht, wenn man eine LOGFONT Struktur definiert und insbesondere lfHeight bestimmt.
-
Bei negativer Zahl müsstest du halt 5 abziehen statt draufaddieren.
Zum Runden haben wir hier doch was:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39342.html
-
Wann brauchst Du denn die Höhe?
Wenn Du den Font hast kannst Du auch einfach mit GetTextMetrics die echte Höhe in Pixeln für Deinen DC ermittln. Du musst nur den Font in den DC selektieren...
-
Mir ist nicht ganz klar, wie Du das meinst ...
Wenn es nur ein paar Zeilen sind, kannst Du es vielleicht hinschreiben.
-
Ein wenig Lektüre:
http://msdn.microsoft.com/en-us/library/aa932923.aspx
http://msdn.microsoft.com/en-us/library/dd162467(VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd183554(VS.85).aspx