2015-05-20 46 views
1

我有vs2008項目沒有unicode支持,沒有工具提示文本顯示。我已經在另一個支持unicode的項目上嘗試過相同的代碼,它工作正常。我究竟做錯了什麼?MFC工具提示不顯示任何文字

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-> szText時會出現問題。我試圖將我的字符串地址分配給lpszText,但工具提示顯示中文符號或其他東西。

回答

1

也許listview控件總是得到unicode消息TTN_NEEDTEXT,並且如果項目是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; 
}