I'm wanting to dynamically resize a CButton to the width of the text within it. Is there either a built-in way to do this in MFC, or a way of calculating the pixel width of some specified text (so that I can use CWnd::SetWindowPos
)?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
You can use CDC::GetTextExtent to calculate the width of text in a certain font. Use CWnd::GetDC to get the Device Context from the control displaying the text.
回答2:
It's tedious. You need to use CWnd::GetFont()
on the button to get the font it's using, and then use the standard GetTextText
on a CDC
object where you will have selected that font.
It looks something like
CClientDC dc( &button );
CFont * pOldFont = dc.SelectObject( button.GetFont() );
... dc.GetTextExtent...
dc.SelectObject( pOldFont);
回答3:
In addition to @demoncodemonkey's answer, you can call CDC::DrawText with the DT_CALCRECT
flag. This way the text won't be drawn, but the CRect you pass to the function will have the width and height of the text to draw.
This is especially useful if you want to draw text with line breaks (using the DT_WORDBREAK
flag). You won't be able to do that using CDC::GetTextExtent
.
回答4:
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
);