EFa*_*nZh 7 user-interface winapi controls
我想将静态控件的大小调整为其内容大小,因此我需要首先计算其文本内容的大小.我找到了一种GetTextExtentPoint32计算大小的方法,但是我需要将DC的字体设置为与控件的字体相同.有一个更好的方法吗?我已经设置了一次静态控件的字体,我想也许我不需要第二次设置DC的字体.
计算静态控件文本内容大小的最佳方法是什么?有没有更好的方法来自动调整静态控件?
在我看来,您似乎已经找到了正确的方法。调用GetTextExtentPoint32以确定控件包含的文本的理想大小,然后将控件大小调整为计算出的大小。
这是很多工作,但这就是使用原始 Win32 API 时会发生的情况。您没有一个方便的包装库,可以在一个Control.AutoSize()函数中为您抽象所有这些。您可以轻松编写自己的函数并重新使用它,但 Win32 标准控件不公开“自动调整大小”API。
至于字体,您肯定需要确保设备上下文使用与控件相同的字体,否则您将计算出错误的大小。但是您不必创建新的设备上下文,请求处理静态控件的字体,然后将其选择到您的新 DC 中。相反,您可以使用该GetDC函数使用静态控件的 DC ,并将句柄传递给您的静态控件窗口。确保如果你打电话GetDC,你总是ReleaseDC在完成后跟进一个电话!
但是,请注意该GetTextExtentPoint32函数的一些注意事项,这些注意事项可能会影响您计算的大小的准确性:
\n换行 ( ) 或回车 ( \r\n)。SS_NOPREFIX样式,它不考虑前缀字符(在字符串中带有 & 符号的前缀字符)并用于表示键盘助记符。(链接文档中都提到了这一点,但有人真的读过吗?)
也许更简单的替代方法是以静态控件已经在做的相同方式绘制文本。除非您有SS_SIMPLE样式集(使用TextOut或ExtTextOut绘制文本作为优化),静态控件通过调用DrawText具有适当参数的函数来绘制它们的文本,给定其他控件样式(参考)。
您可以做完全相同的事情,并DT_CALCRECT在对DrawText函数的调用中添加标志,这会导致它确定绘制指定文本所需的矩形的宽度和高度,而无需实际绘制文本。
| 归档时间: |
|
| 查看次数: |
4396 次 |
| 最近记录: |