新建一个类CMyTree继承自CTreeCtrl
MyTree.h中添加函数声明:
afx_msg BOOL OnToolTipText(UNIT id, NMHDR *pNMHDR, LRESULT *pResult);
virtual INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const;
在MyTree.cpp中添加消息映射
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTTA, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolHitTest)
添加函数实现
INT_PTR CMyTree::OnToolHitTest(CPoint point, TOOLINFO *pTI) const
{
RECT rect;
UNIT nFlags;
HTREEITEM hItem = this->HitTest(point, &nFlags);
if(hItem && (nFlags & TVHT_TEXTCALLBACK))
{
this->GetItemTect(hItem, &rect, TRUE);
pTI->hwnd = m_hWmd;</p><p>
pTI->uId = (UNIT_PTR)hItem;
pTI->lpszText = LPSTR_TEXTCALLBACK;
pTI->rect = rect;
return pTI->uId;
}
return -1;
}
INT_PTR CMyTree::OnToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
TOOLTIPTEXTA *pTTA = (TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW *pTTW = (TOOLTIPTEXTW *)pNMHDR;
CString strTip;</p><p> UINT nID = (UINT)pNMHDR->idForm;
if((nID == (UINT)m_hWnd) &&
(((pNMHDR->code == TTN_NEEDTEXTA) && (pTTA->uFlags & TTF_IDISHWND)) ||
((pNMHDR->code == TTN_NEEDTEXTW) && (pTTW->uFlags & TTF_IDISHWND))))
{
return FALSE;
}
const MSG* pMessage;
CPoint pt;
pMessage = GetCurrentMessage();
ASSERT (pMessage);
pt = pMessage->pt;
ScreenToClient(&pt);
UINT nFlags;
HTREEITEM hItem = this->HitTest(pt, &nFlags);
// 下面是要显示的内容,看自己要显示什么了,我这里显示的就是建立树的时候SetItemData放上的一个数字
DWORD dw = (DWORD)this->GetItemData(hItem);
strTip.Format("0x%04x", dw);
#ifndef _UNICODE
if(pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTA->szText, strTip, 80); // 这里可以注意一下szText就是80个字节
else
_mbstowcsz(pTTW->szText, strTip, 80);
#else
if(pNMHDR->code == TTN_NEEDTEXTA)
_wcstombsz(pTTA->szText, strTip, 80); // 这里可以注意一下szText就是80个字节
else
lstrcpyn(pTTW->szText, strTip, 80);
#endif
*pRestlt = 0;
return TRUE;
}
添加全局变量
CRITICAL_SECTION g_TreeSection;
修改CMyTree的构造函数和析构函数
CMyTree::CMyTree()
{
InitializeCriticalSection(&g_TreeSection);
EnableToolTips(TRUE);
long lStyle = GetWindowLong(this->m_hWnd, GW_SYTLE);
lStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS;
SetWindowLong(this->m_hWnd, GW_STYLE, lStyle);
}
CMyTree::~CMyTree()
{
DeleteCriticalSection(&g_TreeSection);
}
用CTreeCrl的时候,直接声明一个CMyTree的变量就可以了,当鼠标移动到树上的节点的时候,就可以看到一个弹出框,显示节点的信息啦