Ich möchte die exakte Höhe von Text in Windows gerendert finden. Ich habe versucht GetTextExtentPoint32 und Aufruf von DrawText mit dem DT_CALCRECT-Flag und beide geben das gleiche Ergebnis.So finden Sie die EXACT Pixel Höhe von Text in Windows gerendert mit DrawText
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 Visual Studio 2013 Win32-Standardprojekt. Es erstellt eine (große) Schriftart und zeichnet den Beispieltext. Der größte Teil des Textes ist 98 Pixel, aber der Wert von GetTextExtentPoint32 zurückgekehrt ist 131.
Mir ist klar, dass einige Anwendungen könnte die vollständige Zellenhöhe wollen, aber auch einige Anwendungen (wie bei mir) will nur die tatsächlichen Höhe verwendet durch den Text.
Kann jemand diese Informationen finden?
Ja, ich kann in einem Speicher-DC rendern und nach dem ersten nicht-hintergrundfarbenen Pixel suchen - aber das wird super langsam.
Dank
case WM_PAINT:
{
hdc = BeginPaint (hWnd, &ps);
HFONT hfont = CreateFont (-99, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, VARIABLE_PITCH, L"Segoe UI Semibold");
auto old_hfont = SelectObject (hdc, hfont);
wchar_t sample_text[] = L"123 Testing 123";
size_t sample_text_length = wcslen (sample_text);
SIZE s;
GetTextExtentPoint32 (hdc, sample_text, sample_text_length, &s);
RECT r = {10, 10, 10 + s.cx, 10 + s.cy};
SetBkColor (hdc, RGB (80, 120, 160));
SetTextColor (hdc, RGB (220, 220, 220));
DrawText (hdc, sample_text, sample_text_length, &r, DT_SINGLELINE | DT_NOPREFIX | DT_LEFT | DT_TOP);
SelectObject (hdc, old_hfont);
DeleteObject (hfont);
EndPaint (hWnd, &ps);
break;
}
Auf einer Anti-Aliased-Schriftart, was wäre Ihre exakte Höhe? – RedX
Die Gesamtanzahl der Rasterzeilen, in die die DrawText-Operation geschrieben wird? Was ich meine, ist die Höhe zwischen der ersten und der letzten Rasterzeile geschrieben an –
Nur aus Neugier, können Sie weitere Details zum Anwendungsfall dafür angeben? [Mein Instinkt sagt, dass es vielleicht einen besseren Weg gibt, Ihr tatsächliches Problem zu lösen] (http://meta.stackexchange.com/q/66377/what-is-the-xy-problem). – Anthony