GetTextExtentPoint32()中的设备句柄

时间:2016-10-14 08:37:59

标签: c++ winapi graphics libharu

我想使用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()

2 个答案:

答案 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)