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

MFC工具提示不显示任何文本,mfc,tooltip,Mfc,Tooltip,我有一个vs2008上的项目,没有unicode支持,也没有工具提示文本显示。我在另一个支持unicode的项目上尝试了相同的代码,效果很好。我做错了什么 BOOL CListCtrl_ToolTip::OnToolNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { CPoint pt(GetMessagePos()); ScreenToClient(&pt); int nRow, nCol; Cel

我有一个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;
}
BOOL-CListCtrl\u工具提示::OnToolNeedText(UINT-id、NMHDR*pNMHDR、LRESULT*pResult)
{
CPoint pt(GetMessagePos());
ScreenToClient(&pt);
int nRow,nCol;
细胞毒性试验(pt、nRow、nCol);
CString tooltip=gettooltipext(nRow,nCol);
//MessageBox(工具提示,空,MB_OK);
if(tooltip.IsEmpty())
返回FALSE;
//非unicode应用程序可以接收unicode格式的工具提示文本请求
TOOLTIPTEXTA*pTTTA=(TOOLTIPTEXTA*)pNMHDR;
TOOLTIPTEXTW*pTTTW=(TOOLTIPTEXTW*)pNMHDR;
#ifndef\u UNICODE
如果(pNMHDR->code==TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText,静态施法(工具提示),sizeof(pTTTA->szText));
其他的
#否则
如果(pNMHDR->code==TTN_NEEDTEXTA)
_wcstombsz(pTTTA->szText,静态施法(工具提示),sizeof(pTTTA->szText));
其他的
lstrcpyn(pttw->szText,静态施法(工具提示),sizeof(pttw->szText)/sizeof(WCHAR));
#恩迪夫
//如果要显示长度超过80个字符的工具提示,
//然后必须分配所需的文本缓冲区,而不是使用szText,
//并将TOOLTIPTEXT::lpszText指向此文本缓冲区。
//执行此操作时,需要再次释放此文本缓冲区
返回TRUE;
}

工具提示字符串已填充所需的值,但文本不会显示。分配pTTW->szText时出现问题。我尝试将字符串的地址分配给lpszText,但工具提示显示了中文符号或其他内容。

可能listview控件总是为
TTN\u NEEDTEXT
获取unicode消息,并且无论项目是unicode还是ANSI。因此,您不能依赖于
#定义UNICODE

相关问题:

这应该适用于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;
}