1.CToolTipCtrl* m_pToolTip; // 节点信息提示
HTREEITEM m_oldItem; // 记录上一次鼠标所在节点
2. m_pToolTip = new CToolTipCtrl;
m_oldItem = NULL;
3.// 初始化ToolTip
EnableToolTips(TRUE);
m_pToolTip->Create(this);
SetToolTips(m_pToolTip);
m_pToolTip->SetMaxTipWidth(500); // 大于宽度500就换行显示
m_pToolTip->SetDelayTime(2000); // 显示延迟2秒
4. void CMyTree::OnMouseMove(UINT nFlags, CPoint point)
{
UINT uFlags;
HTREEITEM hItem = HitTest(point, &uFlags);
if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
{
// 保留一个,否则显示时会出问题
if (m_pToolTip->GetToolCount() > 1)
m_pToolTip->DelTool(this);
CString strToolTip = "显示内容,可以根据当前hItem设定不同的值";
m_pToolTip->AddTool(this, strToolTip);
// 这里做一个切换,先冻结old然后再激活显示出来new
if (m_oldItem != hItem)
m_pToolTip->Activate(FALSE); // 冻结ToolTip
m_pToolTip->Activate(TRUE); // 激活ToolTip
m_oldItem = hItem;
return CTreeCtrl::OnMouseMove(nFlags, point);
}
}
m_pToolTip->Activate(FALSE);
CTreeCtrl::OnMouseMove(nFlags, point);
}
注意:1.这里的“冻结”是让当前弹出的提示框消失,然后“激活”时再根据延迟时间弹出提示框。
2.这里没有用到PreTranslateMessage(MSG* pMsg),而是用Activate(TRUE/FALSE)达到了同样的效果
3.只用到了一个Tool而不是使用很多 AddTool(this, strToolTip,&rect, UINT_PTR(hItem));
因为(1)当树的节点折叠的时候,这里的rect不再准确。
(2)当树中的节点更新时,需要重新设置Tool,而上面这种写法则方便很多、比较通用。