学习心得:控件之CToolTipCtrl(加入仿系统目录树视图)
2007-09-16 13:39
495 查看
说明:这些代码是建立在仿系统目录树视图之上的。(在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);
}
一、首先在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);
}
相关文章推荐
- 学习心得:控件之Tree Control (仿系统目录树视图)
- 在线电影订票系统 - Vue学习心得
- Linux基础学习--Linux系统目录结构
- 【吹B不如多学习】android系统目录
- WIN32 控件ListView学习心得
- 【实用心得】如何学习嵌入式系统(基于ARM平台)
- Repeater控件学习心得
- PostgreSQL学习手册(系统视图)
- 【牛腩新闻发布系统】视图学习
- 正式加入STM32家族,记录学习32的过程、心得、体会——希望大家给予关照
- Lua学习之为lua 5.1加入LuaFileSystem,一个文件系统访问的库
- ASP.NET MVC3学习心得-----视图和模型
- 【Unity 3D】学习笔记七:ScrollView控件(滚动视图)
- 操作系统学习(九)-- 操作系统之文件系统(目录)
- 从零开始--系统深入学习android(已完成部分的目录--带链接)
- 20135323符运锦期中总结----Linux系统的理解及学习心得
- [转载]关于文件系统和磁盘驱动的一点学习心得
- 让用户减少学习成本——后台系统交互心得(二)(原创理论)
- 【linux学习笔记之一】linux系统目录结构以及常用系统命令
- Linux 学习笔记 -- 第二部分 Linux 文件、目录与磁盘格式 -- 第9章 文件与文件系统的压缩与打包