自动调整静态控件的正确方法是什么?

EFa*_*nZh 7 user-interface winapi controls

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

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

Cod*_*ray 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函数的调用中添加标志,这会导致它确定绘制指定文本所需的矩形的宽度和高度,而无需实际绘制文本。