【发布时间】:2010-12-17 06:30:42
【问题描述】:
我想将 CButton 的大小动态调整为其中文本的宽度。是否有在 MFC 中执行此操作的内置方法,或计算某些指定文本的像素宽度的方法(以便我可以使用 CWnd::SetWindowPos)?
【问题讨论】:
标签: c++ visual-c++ mfc
我想将 CButton 的大小动态调整为其中文本的宽度。是否有在 MFC 中执行此操作的内置方法,或计算某些指定文本的像素宽度的方法(以便我可以使用 CWnd::SetWindowPos)?
【问题讨论】:
标签: c++ visual-c++ mfc
这很乏味。您需要在按钮上使用CWnd::GetFont() 来获取它正在使用的字体,然后在您将选择该字体的CDC 对象上使用标准GetTextText。
它看起来像
CClientDC dc( &button );
CFont * pOldFont = dc.SelectObject( button.GetFont() );
... dc.GetTextExtent...
dc.SelectObject( pOldFont);
【讨论】:
您可以使用CDC::GetTextExtent 计算某种字体的文字宽度。使用CWnd::GetDC 从显示文本的控件中获取设备上下文。
【讨论】:
除了@demoncodemonkey 的回答,您还可以使用DT_CALCRECT 标志调用CDC::DrawText。这样文本不会被绘制,但是您传递给函数的 CRect 将具有要绘制的文本的宽度和高度。
如果您想绘制带有换行符的文本(使用DT_WORDBREAK 标志),这将特别有用。使用CDC::GetTextExtent 将无法做到这一点。
【讨论】:
GetTextExtent 和 DrawText 之间是否存在性能差异?
DrawText 在实际绘制之前必须进行测量和布置文本,而GetTextExtent 只做前者,如果有的话我不会感到惊讶,是的。不过,还没有任何经验数据来支持这一点。
CClientDC hdc(this);
GetRect.SetRect(0,0,iLabelWidth,0);
//
//To get Height of Lable in advance
//
hdc.DrawText(
TempData,
TempData.GetLength(),
GetRect,
DT_CALCRECT | DT_MODIFYSTRING | DT_WORDBREAK
);
【讨论】: