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("\r\n") );
strTextCopy.Delete(0, strLine.GetLength() );
strChaff = strTextCopy.SpanIncluding(_T("\r\n") );
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 ;
}
如果您有更简单的方法来计算宽度,那么我欢迎您的回答。
如果您有更简单的方法来计算宽度,那么我欢迎您的回答。
void CMyMFCButton::UpdateTooltipText(const std::vector<CString>& listText)
{
const auto pDC = m_pToolTip->GetDC();
LONG nMaxWidth{};
if (listText.empty())
{
SetTooltip(nullptr);
return;
}
CString strTooltip;
for (const auto& strText : listText)
{
if (!strTooltip.IsEmpty())
{
strTooltip += L"\r\n";
}
if (pDC != nullptr)
{
const auto nWidth = pDC->GetTextExtent(strText).cx;
nMaxWidth = max(nWidth, nMaxWidth);
}
strTooltip += strText;
}
SetTooltip(strTooltip);
if (nMaxWidth > 0)
{
m_pToolTip->SendMessage(TTM_SETMAXTIPWIDTH, 0, nMaxWidth);
}
}
这似乎与
CMFCButton
的派生类配合得很好。