我希望找到在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;
}
Run Code Online (Sandbox Code Playgroud)
b如果您的示例文本仅包含 ASCII 字母,您可以手动计算升序字母(如 ) 、降序字母(如g)和中位字母(如 )的高度x。您可以提前执行一次,甚至可以离线执行,因此任何低效的方法都可以。
然后(取决于字体,误差范围很小)计算整体高度是对字符串中的上升部分 (bdfhijklt和A-Z) 和下降部分 ( ) 进行简单检查。gjpqy
| 归档时间: |
|
| 查看次数: |
1220 次 |
| 最近记录: |