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

时间:2012-07-22 11:05:36

标签: winapi user-interface controls

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

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

3 个答案:

答案 0 :(得分:3)

听起来我已经找到了正确的方法。调用GetTextExtentPoint32以确定控件的理想大小,并给出其包含的文本,然后将控件的大小调整为计算出的大小。

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

就字体而言,肯定需要确保设备上下文使用与控件相同的字体,否则您将计算错误的大小。但是您不必创建新的设备上下文,请求处理静态控件的字体,并将其选择到新的DC中。相反,您可以使用GetDC函数使用静态控件的DC,并将句柄传递给静态控制窗口。如果您致电GetDC,请务必在完成后随时致电ReleaseDC

但是,请注意GetTextExtentPoint32函数的一些警告,这些警告可能会影响您计算的大小的准确性:

  • 它忽略裁剪。
  • 计算高度时不会考虑新行(\n)或回车符(\r\n)。
  • 它没有考虑前缀字符(字符串前面带有&符号的字符),如果您的静态控件没有SS_NOPREFIX style,则用于表示键盘助记符。
  • 根据可能由某些设备自动实施的字距调整,可能无法返回准确的结果。

(链接文档中都提到了这一点,但实际上有人读过这个吗?)

也许更简单的替代方法是以与静态控件已经完成相同的方式绘制文本。除非您拥有SS_SIMPLE样式集(使用TextOutExtTextOut绘制文本作为优化),否则静态控件会通过调用DrawText函数来调整其文本参数,给定设置的其他控件样式(reference)。

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

答案 1 :(得分:0)

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

如果您没有使用对话框,则可以尝试使用MapDialogRect伪造对话行为。

否则,您必须使用GetTextExtentPoint32

答案 2 :(得分:0)

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

  1. 使用GetWinDowText获取静态窗口的文本
  2. 使用GetDC获取窗口的直流
  3. 使用WM_GETFONT获取窗口的字体,然后在dc
  4. 中选择字体
  5. 使用文本大小计算功能之一来计算文本大小
  6. 恢复原始直流字体
  7. 发布直流
  8. 您必须始终在dc中选择正确的字体才能获得准确的结果。另外,我个人更喜欢使用带有DT_CALCRECT的DrawText来计算文本的大小。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspx

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