如何在 MFC 中获得多行工具提示

Posted

技术标签:

【中文标题】如何在 MFC 中获得多行工具提示【英文标题】:How do I get a multi line tooltip in MFC 【发布时间】:2008-09-30 14:01:08 【问题描述】:

现在,当我将鼠标悬停在编辑框上时,会弹出一个工具提示。问题是这个工具提示包含多条错误消息,而且它们都排成一行。我需要让每条错误消息都在自己的行中。错误消息包含在 CString 中,并用新行分隔它们。

我现有的代码如下。

BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)

    ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
    // need to handle both ANSI and UNICODE versions of the message
    TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
    //    TCHAR szFullText[256];
    CString strTipText=_T("");
    UINT nID = pNMHDR->idFrom;
    if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
        pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
    
        // idFrom is actually the HWND of the tool
        nID = ::GetDlgCtrlID((HWND)nID);
    

    //m_errProjAccel[ch] contains 1 or more error messages each seperated by a new line.
    if((int)nID >= ID_PROJECTED_ACCEL1 && (int)nID < ID_PROJECTED_ACCEL1 + PROJECTED_ROWS -1 ) 
        int ch = nID - ID_PROJECTED_ACCEL1;
        strTipText = m_errProjAccel[ch];
     


#ifndef _UNICODE
    if (pNMHDR->code == TTN_NEEDTEXTA)
        lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0]));
    else
        _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0]));
#else
    if (pNMHDR->code == TTN_NEEDTEXTA)
        _wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0]));
    else
        lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0]));
#endif
    *pResult = 0;

    // bring the tooltip window above other popup windows
    ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
        SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);

    return TRUE;    // message was handled

【问题讨论】:

【参考方案1】:

在 MSDN 库中解释了创建多行工具提示 here - 请阅读“实现多行工具提示”部分。您应该向 ToolTip 控件发送TTM_SETMAXTIPWIDTH 消息以响应TTN_GETDISPINFO 通知,以强制它使用多行。在您的字符串中,您应该使用 \r\n 分隔行。

另外,如果您的文本超过 80 个字符,您应该使用NMTTDISPINFO 结构的lpszText 成员,而不是复制到szText 数组中。

【讨论】:

我正在使用\n。我将其更改为 \r\n 但它似乎没有帮助。 我发现工具提示接受 \n、\r\n 和 \r 作为有效的换行符。我什至能够将它们混合在同一个工具提示中。这是由于我们将修复的软件中的错误/不一致造成的,但它可以正常工作。 要使用 lpszText 你可以这样做:pTTT-&gt;lpszText = const_cast&lt;LPTSTR&gt;(static_cast&lt;LPCTSTR&gt;(strTipText));

以上是关于如何在 MFC 中获得多行工具提示的主要内容,如果未能解决你的问题,请参考以下文章

在MFC中 如何获得外网的IP地址 ,不是本机的IP ,我网线的IP

如何在另一个线程中关闭 MFC 模态对话框并获得对话框返回值?

如何使 Twitter Bootstrap 工具提示有多行?

如何使用 MFC 工具提示的示例代码修复错误?

如何在 ListControl MFC 中有一个多行项目?

MFC 中检查列表框控件中禁用复选框的工具提示