我希望找到Windows下文本渲染的确切高度。我尝试了GetTextExtentPoint32和使用DT_CALCRECT标记调用DrawText,两者给出的结果都相同。
看起来返回的高度是基于整个单元格高度,而不管实际绘制的文本。
下面的代码是标准Visual Studio 2013 Win32项目的WM_PAINT处理程序。它创建一个(大号)字体并绘制示例文本。文本的最高部分为98像素,但GetTextExtentPoint32返回的值为131。
我知道有些应用程序可能需要全单元格高度,但也有一些应用程序(比如我的)只想要文本使用的实际高度。
是否有人知道如何查找此信息?
是的,我可以呈现到内存DC并向下扫描寻找第一个非背景颜色的像素-但这将变得超级缓慢。
谢谢
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;
}