我需要能够根据我的文本和最大宽度来确定编辑框的大小。
有类似的问题和答案,建议GetTextExtentPoint32
或DrawTextEx
。
GetTextExtentPoint32
不支持多行编辑控件,因此不适合。
DrawTextEx
有点作品,但有时候编辑框比必要的大,而且,更糟糕的是,有时候它太小了。
然后有EM_GETRECT
和EM_GETMARGINS
。我不确定是否应该使用其中之一,或者两者兼而有之。
计算尺寸的最准确方法是什么?它应该更复杂......我宁愿不去阅读Wine或ReactOS的源代码。
感谢。
修改
这是我的代码和一个具体的例子:
bool AutoSizeEditControl(CEdit window, LPCTSTR lpszString, int *pnWidth, int *pnHeight, int nMaxWidth = INT_MAX)
{
CFontHandle pEdtFont = window.GetFont();
if(!pEdtFont)
return false;
CClientDC oDC{ window };
CFontHandle pOldFont = oDC.SelectFont(pEdtFont);
CRect rc{ 0, 0, nMaxWidth, 0 };
oDC.DrawTextEx((LPTSTR)lpszString, -1, &rc, DT_CALCRECT | DT_EDITCONTROL | DT_WORDBREAK);
oDC.SelectFont(pOldFont);
::AdjustWindowRectEx(&rc, window.GetStyle(), (!(window.GetStyle() & WS_CHILD) && (window.GetMenu() != NULL)), window.GetExStyle());
UINT nLeftMargin, nRightMargin;
window.GetMargins(nLeftMargin, nRightMargin);
if(pnWidth)
*pnWidth = rc.Width() + nLeftMargin + nRightMargin;
if(pnHeight)
*pnHeight = rc.Height();
return true;
}
我用nMaxWidth
= 143和以下文字(下方)调用它,得到nHeight
= 153,nWidth
= 95.但是这些数字对于文本来说太小了适合,在两个轴上。
文字(两行):
Shopping
https://encrypted.google.com/search?q=winapi+resize+edit+control+to+text+size&source=lnms&tbm=shop&sa=X&ved=0ahUKEwiMyNaWxZjLAhUiLZoKHQcoDqUQ_AUICigE
修改2
我发现DrawTextEx
和退出控件的自动换行算法不同。例如,编辑控件包含在?
上,DrawTextEx
没有。可以做些什么呢?