2009-08-11 4 views
4

Ich habe eine Win32-GUI-Anwendung, die GDI havily verwendet. Es muss an bestimmten Koordinaten Text über eine Bitmap gezeichnet und später gelöscht und durch die Original-Bitmap ersetzt werden.Wie erhalten Sie echte Textdimensionen, wenn ClearType aktiviert ist?

I wie folgt vorgehen:

  • Schriftart auswählen (GetStockObject (DEFAULT_GUI_FONT)), Pinsel, andere Dinge in den Gerätekontext
  • Anruf GetTextExtentPoint32(), um die Größe des Textes
  • nun zu berechnen mit dem Text Startpunkt kann ich das erwartete Text Rechteck berechnen und speichern
  • Aufruf von TextOut() für den gleichen Gerätekontext mit dem gleichen Startpunkt und dem gleichen Text

und später die Bitmap für das Speicherrechteck wiederherstellen.

Es funktioniert einwandfrei, wenn 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 die ursprüngliche Bitmap später wieder herstelle, bleiben einige kleine Streifen des Textes bestehen und ich habe Artefakte.

Gibt es eine Abhilfe, ohne ClearType zu deaktivieren?

Antwort

2

Sie könnten auch DrawText mit DT_CALCRECT versuchen, um die String-Größe zu berechnen. Vielleicht klappt es besser.

Auch Sie können dann die Zeichenkette mit DrawText innerhalb eines Rechtecks ​​mit den Größen schreiben, die denen gleich sind, die Sie mit DT_CALCRECT erhalten, und es schneidet den Text, wenn es ein bisschen größer ist.

+0

Mit DrawText zweimal - zuerst für die Größenberechnung, dann für das Zeichnen funktioniert gut, der Text wird nicht breiter. Vielen Dank. – sharptooth

+2

Der Nachteil ist, dass DrawText nur Schriften mit Null-Hemmung und Orientierung unterstützt. – sharptooth

Verwandte Themen