10

我想将静态控件的大小调整为其内容大小,因此我需要先计算其文本内容的大小。我找到了一种用于GetTextExtentPoint32计算大小的方法,但我需要先将 DC 的字体设置为与控件的字体相同。有一个更好的方法吗?我已经设置了一次静态控件的字体,我想也许我不需要第二次设置 DC 的字体。

计算静态控件文本内容大小的最佳方法是什么?有没有更好的方法来自动调整静态控件的大小?

4

3 回答 3

6

在我看来,您已经找到了正确的方法。调用GetTextExtentPoint32以根据控件包含的文本确定控件的理想大小,然后将控件的大小调整为计算出的大小。

这是很多工作,但是当您使用原始 Win32 API 时会发生这种情况。您没有一个方便的包装库,可以在一个Control.AutoSize()函数中为您抽象出所有这些。您可以轻松编写自己的函数并重新使用它,但 Win32 标准控件不公开“自动调整大小”API。

至于字体,您肯定需要确保设备上下文使用与控件相同的字体,否则您将计算错误的大小。但是您不必创建新的设备上下文、请求处理静态控件的字体并将其选择到新的 DC 中。相反,您可以使用该GetDC函数使用静态控件的 DC,并将句柄传递给您的静态控件窗口。确保如果你打电话,你总是在你完成后GetDC跟进一个电话!ReleaseDC

但是,请注意该函数的一些注意事项,这些注意事项GetTextExtentPoint32可能会干扰您计算的大小的准确性:

  • 它忽略剪辑。
  • 在计算高度时,它不考虑换行符 ( \n) 或回车符 ( )。\r\n
  • 它不考虑前缀字符(在字符串中以 & 符号开头的字符),如果您的静态控件没有SS_NOPREFIX样式,则用于表示键盘助记符。
  • 根据某些设备可能自动实现的字距调整,它可能无法返回准确的结果。

(这在链接的文档中都提到了,但有人真的读过吗?)

也许更简单的替代方法是用静态控件已经在做的相同方式绘制文本。除非您有SS_SIMPLE样式集(它使用TextOutExtTextOut绘制文本作为优化),静态控件通过调用DrawText具有适当参数的函数来绘制它们的文本,给定设置的其他控件样式(参考)。

您可以执行完全相同的操作,并DT_CALCRECT在对函数的调用中添加标志DrawText,这会导致它确定绘制指定文本所需的矩形的宽度和高度,而无需实际绘制文本。

于 2012-07-22T11:45:20.470 回答
0

大多数使用静态文本控件的窗口都是对话框,其中静态控件的大小以对话框单位 (DLU) 表示,它大致说明了字体的大小。通过这种方式,对话框控件往往具有合理的大小。

如果您不使用对话框,您可以尝试使用MapDialogRect.

否则是的,您必须使用GetTextExtentPoint32.

于 2012-07-22T11:21:04.293 回答
0

据我所知,静态控制没有自动调整大小。你做得对。

  1. 使用 GetWinDowText 获取静态窗口的文本
  2. 使用 GetDC 获取窗口的 dc
  3. 使用 WM_GETFONT 获取窗口的字体并将字体选择到 dc
  4. 使用其中一种文字大小计算功能来计算文字大小
  5. 恢复原来的dc字体
  6. 释放直流

您将始终必须在 dc 中选择正确的字体才能获得准确的结果。此外,我个人更喜欢使用 DT_CALCRECT 的 DrawText 来计算文本的大小。参考http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspx

使用 DrawText,如果文本以 NULL 结尾,则不必提供字符数。另外,您可以结合各种格式选项来调整计算。例如,静态控件文本中的 & 字符为下一个字符加下划线。使用 Drawtext,您将能够正确计算大小,但在 GetTextExtentPoint32 中没有规定指定这一点。

于 2012-07-22T11:33:41.510 回答