Wie erhalte ich echte Textabmessungen, wenn ClearType aktiviert ist?
Frage
Ich habe eine Win32-GUI-Anwendung, die GDI häufig nutzt.Es muss Text an bestimmten Koordinaten über eine Bitmap zeichnen und ihn später löschen und durch die ursprüngliche Bitmap ersetzen.
Ich gehe wie folgt vor:
- Wählen Sie Schriftart (GetStockObject (DEFAULT_GUI_FONT)), Pinsel und andere Dinge im Gerätekontext aus
- Rufen Sie GetTextExtentPoint32() auf, um die Größe des Texts zu berechnen
- Da ich nun den Textstartpunkt habe, kann ich das erwartete Textrechteck berechnen und speichern
- Rufen Sie TextOut() für denselben Gerätekontext mit demselben Startpunkt und demselben Text auf
und später die Bitmap für das Speicherrechteck wiederherstellen.
Es funktioniert einwandfrei, wenn das ClearType-Antialiasing deaktiviert ist.Aber mit ClearType ist die von GetTextExtentPoint32() zurückgegebene Größe etwas kleiner als die tatsächlich vom Text belegte Größe, wenn TextOut() aufgerufen wird.Wenn ich also später die ursprüngliche Bitmap wiederherstelle, bleiben einige kleine Streifen des Textes an Ort und Stelle und ich habe Artefakte.
Gibt es eine Lösung dafür, ohne ClearType zu deaktivieren?
Lösung
Du könntest es auch versuchen DrawText mit DT_CALCRECT, um die Stringgröße zu berechnen.Vielleicht funktioniert es besser.
Sie können die Zeichenfolge dann auch mit DrawText in ein Rechteck schreiben, dessen Größe der Größe entspricht, die Sie mit DT_CALCRECT erhalten, und der Text wird abgeschnitten, falls er etwas größer ist.