您的位置:首页 > 其它

学习心得:控件之CToolTipCtrl(加入仿系统目录树视图)

2007-09-16 13:39 441 查看
说明:这些代码是建立在仿系统目录树视图之上的。(在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,代码如下:


BOOL CBrowseSysTreeDlg::PreTranslateMessage(MSG * pMsg)




...{


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);


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: