MFC工具提示不显示任何文本

时间:2015-05-20 17:35:00

标签: mfc tooltip

我在vs2008上有一个没有unicode支持的项目,并且没有工具提示文字显示。我在另一个支持unicode的项目中尝试了相同的代码,它运行正常。我做错了什么?

BOOL CListCtrl_ToolTip::OnToolNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
    CPoint pt(GetMessagePos());
    ScreenToClient(&pt);

    int nRow, nCol;
    CellHitTest(pt, nRow, nCol);

    CString tooltip = GetToolTipText(nRow, nCol);
    //MessageBox(tooltip,NULL, MB_OK);
    if (tooltip.IsEmpty())
        return FALSE;

    // Non-unicode applications can receive requests for tooltip-text in unicode
    TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;

#ifndef _UNICODE
    if (pNMHDR->code == TTN_NEEDTEXTA)

        lstrcpyn(pTTTA->szText, static_cast<LPCTSTR>(tooltip), sizeof(pTTTA->szText));
    else

#else
    if (pNMHDR->code == TTN_NEEDTEXTA)
        _wcstombsz(pTTTA->szText, static_cast<LPCTSTR>(tooltip), sizeof(pTTTA->szText));
    else
        lstrcpyn(pTTTW->szText, static_cast<LPCTSTR>(tooltip), sizeof(pTTTW->szText)/sizeof(WCHAR));
#endif
    // If wanting to display a tooltip which is longer than 80 characters,
    // then one must allocate the needed text-buffer instead of using szText,
    // and point the TOOLTIPTEXT::lpszText to this text-buffer.
    // When doing this, then one is required to release this text-buffer again
    return TRUE;
}

工具提示字符串填充了所需的值,但文本未显示。分配 pTTW-&gt; szText 时会发生此问题。我试图将我的字符串的地址分配给lpszText,但是工具提示显示了中文符号或其他内容。

1 个答案:

答案 0 :(得分:1)

listview控件可能总是为 TTN_NEEDTEXT 获取unicode消息,如果项目是unicode或ANSI则无关紧要。因此,您不能依赖#define UNICODE

相关问题:TTN_NEEDTEXTA/TTN_NEEDTEXTW

这应该适用于unicode和非unicode:

BEGIN_MESSAGE_MAP(TList, CListCtrl)
   ON_NOTIFY_EX(TTN_NEEDTEXTA, 0, OnToolNeedText)
   ON_NOTIFY_EX(TTN_NEEDTEXTW, 0, OnToolNeedText)
END_MESSAGE_MAP()

BOOL TList::OnToolNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult)
{
   CPoint pt(GetMessagePos()); 
   ScreenToClient(&pt);

   int nRow, nCol;
   CellHitTest(pt, nRow, nCol);
   CString tooltip = GetToolTipText(nRow, nCol);
   if (tooltip.IsEmpty())
      return FALSE;

   if (pNMHDR->code == TTN_NEEDTEXTW)
   {
      TOOLTIPTEXTW* ttext = (TOOLTIPTEXTW*)pNMHDR;
      CStringW sw(tooltip);
      lstrcpynW(ttext->szText, sw, sizeof(ttext->szText)/sizeof(wchar_t));
   }
   else 
   {
      TOOLTIPTEXTA* ttext = (TOOLTIPTEXTA*)pNMHDR;
      CStringA sa(tooltip);
      lstrcpynA(ttext->szText, sa, sizeof(ttext->szText));
   }

   return TRUE;
}