多行工具提示和 CMFCButton

问题描述 投票:0回答:2

目前我正在使用标准

CButton
控件和我自己派生的
CMultilineToolTipCtrl
来能够显示多行工具提示。

我想我会尝试使用

CMFCButton
控件作为替代方案,因为它通过调用
SetTooltip
对工具提示提供本机支持。

但是,据我所知,它似乎不支持多行文本。有没有一个简单的解决方案,或者我应该坚持我编写的代码?

button mfc tooltip
2个回答
0
投票

这是派生的工具提示控件,用于确定工具提示控件的正确宽度:

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 ;
}

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


0
投票

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

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
的派生类配合得很好。

© www.soinside.com 2019 - 2024. All rights reserved.