我想使用GetTextExtentPoint32
来计算字符串的大小(以像素为单位)。 GetTextExtentPoint32
具有以下语法:
BOOL GetTextExtentPoint32(
_In_ HDC hdc,
_In_ LPCTSTR lpString,
_In_ int c,
_Out_ LPSIZE lpSize
);
其中hdc [in]
是设备上下文的句柄。
问题:
我使用以下代码在 libharu 中加载 字体
//-----UTF8 Encoding
HPDF_UseUTFEncodings(pdf);
const char *fontname = HPDF_LoadTTFontFromFile(pdf, "FreeSans.ttf", HPDF_TRUE);
HPDF_Font font = HPDF_GetFont(pdf, fontname, "UTF-8");
如何将 设备句柄 传递/计算到 GetTextExtentPoint32()?
更新
我在分辨率(1920x1080)的显示器上使用Win-7。我的目标是使用 Libharu 库生成PDF报告。我想以像素为单位计算字符串的长度,为此,我想使用GetTextExtentPoint32()
答案 0 :(得分:1)
因此,要使用libharu获取PDF中文本字符串的宽度,请使用HPDF_Font_TextWidth()
。这将返回HPDF_TextWidth
结构;使用其width
字段。宽度将以 1/1000 em 或 1000 ems 进行测量,我不确定哪个(使用“em”TrueType用于em的任何意义)方形),我假设PDF本身用于测量。您必须检查HPDF的其余文档。
我不确定这是否需要考虑字距。
确认:HPDF的一般字体处理源,HDPF的TrueType字体处理源,Apple的TrueType字体引用。确切的计算是
一个字形的宽度= advance_width(单位)* 1000 / units_per_em
答案 1 :(得分:0)
Windows GDI适用于像素。 Haru PDF与点(72点/英寸)一起使用。在Haru PDF中没有直接等同于GetTextExtentPoint32()
。
如果您想以PDF格式复制GDI结果,则需要:
[1]调用GetTextExtentPoint32()
以GDI像素获取文本大小。
[2]用设备上下文分辨率(像素/英寸)除以宽度(以像素为单位),然后乘以72得到点。致电GetDeviceCaps(hdc, LOGPIXELSX)
获取像素/英寸。调用此结果fTargetWidth
。这是你对字符串的期望范围。
[3]编写PDF时,请调用HPDF_Font_TextWidth()
以获取从Haru看到的字符串宽度。如果PDF宽度大于GDI"点"宽度,收紧间距,减去字符范围内的多余部分:
// how long is this string?
HPDF_TextWidth htw = HPDF_Font_TextWidth(pdfFont, (HPDF_BYTE *)string, len);
// convert to actual points
fWidth = (htw.width * fontPoints) / 1000.f;
// does it overflow?
if(fWidth > fTargetWidth && htw.numchars > 0)
{ excess = fWidth - fTargetWidth; // by how much
charSpace = -excess / htw.numchars; // note negative
// tighten up the spacing
HPDF_Page_SetCharSpace(page, charSpace);
}
HPDF_Page_TextOut (page, x, y, string);
HPDF_Page_SetCharSpace(page, 0.f); // reset
出于某种原因,HPDF_Page_SetWordSpace()
似乎没有任何效果。
为什么相同尺寸的相同字体宽度有这么大差异?所见即所得:o)