多行工具提示和CMFCButton



目前,我正在使用标准的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 ;
}

如果你有一个更简单的方法来计算宽度,那么我欢迎你的回答。

最新更新