说明:这些代码是建立在仿系统目录树视图之上的。(在vs2005下编译通过)
一、首先在BrowseSysTreeDlg.h 中加入成员CToolTipCtrl* m_pToolTipCtrl。在资源里,Tree Control把ToolTip的属性设为True;
二、然后就是初始化,在BOOL CBrowseSysTreeDlg::OnInitDialog()加入如下代码:
…………………………
m_pToolTipCtrl = new CToolTipCtrl; //记住要找个地方释放内存
if (NULL == m_pToolTipCtrl || (!m_pToolTipCtrl->Create(this, TTS_ALWAYSTIP)))
return FALSE;
m_pToolTipCtrl->AddTool(&m_ctrlTree, _T("szPath:")); //加入
……………………
三、加入之后就是怎么获取消息了,这里是重载了PreTranslateMessage(MSG * pMsg),在ranslateMessage之前
截获WM_MOUSEMOVE,代码如下:
{
if(pMsg->message == WM_MOUSEMOVE && pMsg->hwnd == m_ctrlTree.m_hWnd)
{
CPoint point(LOWORD(pMsg->lParam),HIWORD(pMsg->lParam));
HTREEITEM hItem = m_ctrlTree.HitTest(point);
if(hItem != NULL)
{
LPNODEINFO lpNodeInfo = (LPNODEINFO)m_ctrlTree.GetItemData(hItem);
m_pToolTipCtrl->UpdateTipText(lpNodeInfo->szPath,&m_ctrlTree);
m_pToolTipCtrl->RelayEvent(pMsg);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
另一种方法:
1.在增加ToolTip时不指定显示的字串,而是使用LPSTR_TEXTCALLBACK。
2.在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。
4.在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, 3LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。
BOOL CBrowseSysTreeDlg::SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult )
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
UINT nID =pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND
if (pTTT->uFlags & TTF_IDISHWND) //表明nID是否为HWND
{
nID = ::GetDlgCtrlID((HWND)nID);//从HWND得到ID值,当然你也可以通过HWND值判断
switch(nID)
{
case(IDC_YOUR_CONTROL1):
//设置相应的显示字串
return TRUE;
break;
case(IDC_YOUR_CONTROL2) :
//设置相应的显示字串
return TRUE;
break;
}
}
return(FALSE);
}