【问题标题】:How to detect the length of text in Windows?如何检测 Windows 中的文本长度?
【发布时间】:2013-12-16 19:43:18
【问题描述】:

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

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

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

那么我该怎么做呢?

【问题讨论】:

    标签: text-size


    【解决方案1】:

    最后,我能够使用来自Length of a string in pixels 的这个类型做我想做的事:

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

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

    所以,问题解决了!

    【讨论】:

      【解决方案2】:

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

      代码 sn-p:

      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
      

      【讨论】:

      • 我不确定这是否可行;我记得前一段时间尝试使用 GetTextMetrics (可能不完全像你那样),它给出了相同的 16 值;有点巧合?但如果我还有时间,我会试试你的代码。无论如何,谢谢!
      猜你喜欢
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多