Benutzer mit den meisten Antworten
"Orientierung" von Schriften funktioniert nicht

Frage
-
Hallo Forum
Ich möchte gerne für eine 3D Darstellung die Schriften verdrehen. Dazu muss ich den "Escapement" Vektor auf 45° stellen (damit die Schrift in die Bildebene hineinläuft) und die "Orientierung" sollte natürlich noch einmal 45° dazu stehen, damit die Schrift in der Ebene liegt.
Mit CreateFont(sx,sy,450,450,...)oder auch CreateFont(sx,sy,450,900,...) habe ich zwar die "Escapement" Richtung auf 45°, nicht jedoch die Zeichen verdreht.
Nun sagt mir die MSDN, dass solche Tricks sowieso nur mit GM_ADVANCED funktionieren, also mache ich zu beginn der Funktion
int OGM = ::SetGraphicsMode(pDC->m_hDC,GM_ADVANCED);
und danach stelle ich alles wieder zurück
if (OGM) SetGraphicsMode(pDC->m_hDC,OGM);
Nur die Sache funktioniert leider nicht. Brauch ich da noch weitere Voraussetzungen?
Ich muss dazusagen, dass ich aus Kompatibilitätsgründen noch mit Visual C 6.x arbeite (pDC->SetGraphicsMode kennt der noch gar nicht). Betriebssystem ist WinXP Prof. (lt. MSDN sollte es ab W2K gehen).
Grüße
FireHeart
Antworten
-
Ich befürchte das Du das anders machen musst.
Du kannst mit der GDI Funktion BeginPath/EndPath Dir alle Linien ermitteln lassen, die für die Zeichenausgabe notwendig sind.
Anschließend könntest Du die Koordinaten transformieren.
Hier ein Beispiel wie man einen Truetype Font als grafisches Element erzeugt.
http://www.ucancode.net/Visual_C_Control/GetPath-BeginPath-EndPath-draw-ourline-text.htm
HTH
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Fire-Heart Montag, 15. März 2010 11:22
Alle Antworten
-
Nein! Das ist nicht nötig.
Joseph Newcommer hat in diesem Posting fast ein komplettes Beispiel:
http://mfcgoldmine.uuuq.com/Convert/Articles/Font_Code/zArticle_02511869.html
Oder schau in diesen CodeProject Artikel:
http://www.codeproject.com/KB/static/rotated_bevel.aspx
Selbst wenn Du pure WinAPI verwenden willst sollte das Erzeugen des Fonts aus diesem Beispiel klar werden.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Hallo Martin Jetzt hab ich nochmals alles genau durchgesehen, und den SetGraphicMode Befehl VOR die Initialisierung des Zeichensatzes gestellt und dann hat's funktioniert...nur natürlich nicht so, wie ich es mir vorgestellt hätte. Er dreht jetzt die Zeichen um 90° und macht aber den Zeichenvorschub um 45°. Somit gelange ich zum klassischen Programmiererproblem: Hilfe, mein Computer tut was ich ihm befehle, aber nicht das was ich will! Welche Möglichkeiten hätte ich jetzt noch, eine Schrift 3D tauglich zu machen? Ich will ja eigentlich, dass die "Escapement" mit 45° bleibt, alle waagrechten Zeichenlinien auf der 45° Escapement-Gerade liegen, aber alle senkrechten Linien 45° zum Escapement liegen, also bereits horizontal sind (nur so sieht die Schrift in der waagrechten 3D Ebene liegend aus). Im Grunde gehören die Zeichen also eine Art von "Italic", nur 45° nach links fallend anstelle von 30° nach rechts fallend. Gibt's da noch etwas? Als "brute force" Methode fiele mir noch ein, eine ganze Zeile normalen Text in ein Bitmap zu schreiben und dieses dann pixelweise zu verzerren, bevor man es auf den eigentlichen Device-Kontext kopiert, aber das kann's ja wohl doch nicht sein, oder? Grüße FireHeart
-
Ich befürchte das Du das anders machen musst.
Du kannst mit der GDI Funktion BeginPath/EndPath Dir alle Linien ermitteln lassen, die für die Zeichenausgabe notwendig sind.
Anschließend könntest Du die Koordinaten transformieren.
Hier ein Beispiel wie man einen Truetype Font als grafisches Element erzeugt.
http://www.ucancode.net/Visual_C_Control/GetPath-BeginPath-EndPath-draw-ourline-text.htm
HTH
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Fire-Heart Montag, 15. März 2010 11:22