目前,我正在使用标准的CButton
控件和我自己派生的CMultilineToolTipCtrl
来显示多行工具提示。
我想我应该尝试CMFCButton
控件作为替代,因为它通过调用SetTooltip
对工具提示提供了本机支持。
然而,据我所知,它似乎不支持多行文字。有没有一个简单的解决方案,或者我应该坚持我已经编码的内容?
这是派生的工具提示控件,用于确定工具提示控件的正确宽度:
UINT CMultilineToolTipCtrl::FitText(CString &rStrText)
{
CClientDC *pDC ;
CFont *pFntTip, *pFntOld ;
CRect rctMargin, rctTip ;
CSize sizText ;
CString strTextCopy, strLine, strChaff ;
CStringArray aryStrLines ;
UINT uMaxWidth;
INT_PTR uNumLines, uLineIndex ;
uMaxWidth = 0 ; // Fallback.
GetMargin(&rctMargin);
GetClientRect(&rctTip);
// Reduce by the given margins to get the true area.
rctTip.left += rctMargin.left ;
rctTip.top += rctMargin.top ;
rctTip.right -= rctMargin.right ;
rctTip.bottom -= rctMargin.bottom ;
pDC = new CClientDC(this);
if (pDC != nullptr)
{
pFntTip = GetFont();
pFntOld = (CFont *)pDC->SelectObject(pFntTip);
// First, find the longest line.
strTextCopy = rStrText ;
uMaxWidth = 0 ;
while (strTextCopy != _T("") )
{
strLine = strTextCopy.SpanExcluding(_T("rn") );
strTextCopy.Delete(0, strLine.GetLength() );
strChaff = strTextCopy.SpanIncluding(_T("rn") );
strTextCopy.Delete(0, strChaff.GetLength() );
sizText = pDC->GetTextExtent(strLine);
if (sizText.cx > (int)uMaxWidth)
uMaxWidth = sizText.cx ;
aryStrLines.Add(strLine);
}
rStrText = _T("");
uNumLines = aryStrLines.GetSize();
// Now, pad all lines to that max width.
for (uLineIndex = 0 ; uLineIndex < uNumLines ; uLineIndex++)
{
strLine = aryStrLines.GetAt(uLineIndex);
sizText = pDC->GetTextExtent(strLine);
while (sizText.cx <= (int)uMaxWidth)
{
strLine += _T(" ");
sizText = pDC->GetTextExtent(strLine);
}
rStrText += strLine ;
}
SendMessage(TTM_SETMAXTIPWIDTH, 0, uMaxWidth);
pDC->SelectObject(pFntOld);
delete pDC ;
}
return uMaxWidth ;
}
如果你有一个更简单的方法来计算宽度,那么我欢迎你的回答。