So finden Sie die EXACT-Pixelhöhe von Text, der in Windows mit DrawText gerendert wird

8

Ich möchte die exakte Höhe von Text finden, der in Windows gerendert wird. Ich habe GetTextExtentPoint32 ausprobiert und DrawText mit dem DT_CALCRECT-Flag aufgerufen und beide geben das gleiche Ergebnis.

Es scheint, dass die zurückgegebene Höhe auf der vollen Zellenhöhe basiert, unabhängig vom tatsächlich zu zeichnenden Text.

Der folgende Code ist der WM_PAINT-Handler für ein Standard-Visual Studio 2013 Win32-Projekt. Es erstellt eine (große) Schriftart und zeichnet den Beispieltext. Der höchste Teil des Textes ist 98 Pixel, aber der von GetTextExtentPoint32 zurückgegebene Wert ist 131.

Mir ist klar, dass einige Anwendungen die volle Zellenhöhe haben möchten, aber auch einige Anwendungen (wie meine) wollen nur die tatsächliche Höhe, die vom Text verwendet wird.

Weiß jemand, wie man diese Information findet?

Ja, ich kann in einen Speicher-DC rendern und nach dem ersten nicht-hintergrundfarbenen Pixel suchen - aber das wird sehr langsam.

Danke

%Vor%     
Anthony Wild 17.03.2015, 13:54
quelle

4 Antworten

7

Sehen Sie sich GetGlyphOutline(GGO_METRICS) Die zurückgegebene GLYPHMETRICS struct sollte alle Daten enthalten, die Sie zum Berechnen des Extents benötigen.

    
Paul Groke 18.08.2015 23:37
quelle
4

Ihr Text wird nicht direkt gezeichnet, zuerst wird er zu einem Pfad beschreibt die Umrisse Ihrer Geometrien / Glyphen. Ein Pfad besteht aus Bewegungen, Linien und Kurven (und einer Schließen-Flagge zum Prior). Abgesehen von Kurven sind andere Pfadsegmente extreme Punkte für die endgültige Füllung. Umwandeln von Kurven in Linien und Iterieren durch alle Pfadsegmente, um das Minimum und Maximum in horizontaler & amp; vertikale Dimension durch die Punkte ergibt das am nächsten passende Rechteck zu Ihrem Text.

Sie können Ihren Text in einen Pfad umwandeln, indem Sie ihn mit dem Aufruf zeichnen BeginPath zuvor und EndPath danach. FlattenPfad führt die Kurven- & gt; -Zeilenkonvertierung aus. GetPath bietet Zugriff auf die Pfadpunkte im Kontext. AbortPath entfernt schließlich den Pfad aus dem Kontext.

>

Wenn Sie nicht den Hintergrund auf transparent gesetzt haben , der Pfad kann der Hintergrund um Ihren Text sein und bereits die ersten Pfadsegmente sind die Hintergrund / Extents Rechtecklinien - nicht was Sie wollen.

Um diese Methode zu vereinfachen, können Sie wiederholte Zeichen und Gruppenzeichen um 1) unter der Basislinie 2) über der Mittellinie 3) Pause ausschließen. Das alles funktioniert sehr schnell im Vergleich zu deinen "look pixels" Versuchen.

Weitere nützliche Quellen zu Textgrößen sind Schriftmetriken ( GetTextMetrics ) und Zeichenbreiten ( GetCharABCWidths )

    
Youka 20.08.2015 15:30
quelle
3

Wenn Ihr Beispieltext nur ASCII-Buchstaben enthält, können Sie die Höhe eines aufsteigenden Buchstabens wie b , einen absteigenden Buchstaben wie g und einen mittleren Buchstaben wie x manuell auswerten. Du würdest das einmal im Voraus tun, wahrscheinlich sogar offline, also ist jede ineffiziente Methode vollkommen in Ordnung.

Dann (abhängig von der Schrift bis zu einer kleinen Fehlerspanne) ist die Berechnung der Gesamthöhe eine einfache Überprüfung für Oberlängen ( bdfhijklt und A-Z ) und Unterlängen ( gjpqy ) in Ihrer Zeichenkette.

    
klimpergeist 18.08.2015 23:02
quelle
2

Wenn es sich um eine TrueType-Schriftart handelt, können Sie die Größe der Positionierung der Glyphe w.r.t finden. der 'vorherige' Buchstabe und die Zeile in der fmtx-Tabelle wie hier . Es gibt auch ähnliche Informationen , die für OpenType-Schriftarten verfügbar sind, aber es scheint mühsamer, etwas Bedeutungsvolles abzuleiten.

Dies gibt Ihnen nicht die tatsächliche Pixelgröße des Glyphs, aber es gibt Ihnen eine genauere Vorstellung, wo der True-Type-Schriftpfad für ein bestimmtes Glyph in Bezug auf die 'Grundlinie' und die Einheiten gezeichnet wird skalieren mit der Punktgröße und sind font-weit.

In Ihrem Fall würde ich FreeType betrachten, eine Bibliothek von Drittanbietern, die schnell ist und Rasterschriften, TrueType und OpenType-Schriften unterstützt. Es ist weit verbreitet und sehr gut dokumentiert und wird unterstützt und kann genaue Metriken liefern.

    
StarShine 21.08.2015 09:50
quelle

Tags und Links