0

在我使用 Builder C++ 6 为 Windows 编写的软件中,我需要创建一个 .pdf 文章,其中包含用户编辑的一些信息并存储在数据库中。此信息的一部分必须在设计的矩形内绘制,因此我需要检查 55max 字符串是否适合矩形内的一行。如果没有,那么我需要计算应该在哪里换行(\n)。

通常文本确实适合只有 55 个字符的矩形,但有时一些不常见的文本(例如“WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW...”)虽然具有相同数量的字符,但最终会弄乱整个事情。换句话说,我不能使用字符串中的字符数来确定何时换行,而是以像素(或其他度量单位)为单位的文本长度,所以我可以检查字符串在.pdf 是否为矩形容器。

我尝试了诸如 GetCharABCWidths()、GetTextExtentPoint32() 之类的函数,但没有成功(每次我将函数用于相同的字符串/字符时,所谓的“逻辑单元”都不同,我不知道如何使用它们,或者即使它们明显不同('1' 与 'W' 相比),char 的长度也是相等的,或者其他)。

那么我该怎么做呢?

4

2 回答 2

1

最后,我可以使用Length of a string in pixels 中的这个类型来做我想做的事情:

要获得更准确的测量结果,您可以使用字符串填充 TextField,然后测量该 TextField 文本的宽度。

这让我回到了 Borland C++ Builder,在那里我找到了一个函数 (Canvas->TextExtent),它告诉我字符串在画布中占据了多少。

所以,问题解决了!

于 2012-10-10T19:45:20.797 回答
0

您还可以使用 DrawText 函数。只需将 DT_CALCRECT 标志传递给函数。甚至 GetTextMetrics - 我都在这里使用过。它们是普通的、普通的 win32 函数。适用于您希望尝试的任何支持 win32 progs 的编译器。VS、GCC、Borland等

代码片段:

HDC hDC;
TEXTMETRIC textMetric;
HFONT   hFont, hOldFont;
int sizeInPpoints, lineHeight;
RECT textRect;
char *buffer = "Comprimento em pixels desta string!";

hDC = GetDC(hwnd);
sizeInPpoints = MulDiv(10, GetDeviceCaps(hDC, LOGPIXELSY), 72);
hFont = CreateFont(-sizeInPpoints, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, 0, 0, 0, 0, "Courier New");
hOldFont = (HFONT)SelectObject(hDC, hFont);

GetTextMetrics(hDC, &textMetric);

lineHeight = textMetric.tmHeight; // character height in current font

textRect.left = textRect.right = textRect.top = textRect.bottom = 0;
DrawText(hDC, buffer, strlen(buffer), &textRect, DT_CALCRECT);

printf("Size of text calculated by DrawText: [%d x %d]\n", textRect.right, textRect.bottom);
printf("Height of text calculated by GetTextMetrics: %d\n", lineHeight);

输出:

Size of text calculated by DrawText: [280 x 16]
Height of text calculated by GetTextMetrics: 16
于 2012-10-10T20:01:40.690 回答