




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC中给树形控件的图标加上工具提示 我从没有在任何一个应用程序中看到过图标的工具提示。有时候查遍了整个帮助文档也没有明白某个图标是什么意思。如果能在自己的程序中为图标加上工具提示,一定会使界面的友好性大大增加。本文中以树形控件为例,详细介绍了在VC中使用MFC提供的机制来实现图标工具提示的方法。 - 第一步:使控件可以显示工具提示 - 调用EnableToolTips(TRUE)使一个窗口可以显示工具提示。在什么地方插入这条代码最好呢?在类的PreSubclassWindow()中。因为不管一个控件如何被创建,MFC都会调用此函数。而其他的函数则不一定会被调用。以OnCreate()为例,如果调用Create()或CreateEx()创建一个控件,OnCreate()会被调用,而如果一个控件是从对话框资源创建,OnCreate()就不会被调用。 实现代码如下:void CTreeCtrlX:PreSubclassWindow() CTreeCtrl:PreSubclassWindow();EnableToolTips(TRUE);- 第二步:重载虚函数OnToolHitTest() - MFC调用函数来确定在某个点是否应该显示工具提示。MSDN建议如果鼠标落在应该显示工具提示的点上,返回值1。这并不完全正确。这个函数应该返回不同的值来区分窗口中不同的应该显示提示的区域。 - 在这个函数中,本文只处理鼠标落在节点图标或节点状态图标上的情况。读者可以按照自己的情况向树的其他元素上添加工具提示。在两种情况下,都要计算图标的区域,并且把TOOLINFO的uID设为鼠标所在点的树节点的句柄。注意,尽管对于节点图标和节点状态图标,使用了相同的id,但返回值并不相同。不同的返回值迫使MFC更新工具提示。 - 虽然我们可以在此函数中给出工具提示,但因为鼠标的每次移动都会调用此函数,太多的处理并不是一个好注意,所以我们在其他的函数中处理应该显示什么提示的问题。 类声明中的代码如下所示:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CTreeCtrlX)protected:virtual int OnToolHitTest( CPoint point, TOOLINFO* pTI ) const;/AFX_VIRTUAL实现代码如下所示:int CTreeCtrlX:OnToolHitTest(CPoint point, TOOLINFO * pTI) constRECT rect;UINT nFlags;HTREEITEM hitem = HitTest( point, &nFlags );if( nFlags & TVHT_ONITEMICON )CImageList *pImg = GetImageList( TVSIL_NORMAL );IMAGEINFO imageinfo;pImg- GetImageInfo( 0, &imageinfo );GetItemRect( hitem, &rect, TRUE );rect.right = rect.left - 2;rect.left -= (imageinfo.rcImage.right + 2);pTI- hwnd = m_hWnd;pTI- uId = (UINT)hitem;pTI- lpszText = LPSTR_TEXTCALLBACK;pTI- rect = rect;return pTI- uId;else if( nFlags & TVHT_ONITEMSTATEICON )CImageList *pImg = GetImageList( TVSIL_NORMAL );IMAGEINFO imageinfo;pImg- GetImageInfo( 0, &imageinfo );GetItemRect( hitem, &rect, TRUE );rect.right = rect.left - (imageinfo.rcImage.right + 2);pImg = GetImageList( TVSIL_STATE );rect.left = rect.right - imageinfo.rcImage.right ;pTI- hwnd = m_hWnd;pTI- uId = (UINT)hitem;pTI- lpszText = LPSTR_TEXTCALLBACK;pTI- rect = rect;/ 返回与节点图标不同的值return pTI- uId*2; return -1;- 第三步:处理TTN_NEEDTEXT消息; - 加入一个函数处理TTN_NEEDTEXT消息通知。当工具处理控制需要知道应该显示什么信息时,这条消息被发出。由于上一步中我们给TOOLINFO的lpszText赋值为LPSTR_TEXTCALLBACK,所以我们要处理这个消息VC的ClassWizard并不支持这条消息被映射,所以只有我们自己加入这条消息的映射机制加入到MESSAGE_MAP中去。我们不得不处理这个消息的两个版本,TTN_NEEDTEXTA和TTN_NEEDTEXTA。消息映射的代码如下所示: BEGIN_MESSAGE_MAP(CTreeCtrlX, CTreeCtrl)/AFX_MSG_MAP(CTreeCtrlX)/AFX_MSG_MAPON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)END_MESSAGE_MAP()下面的代码是加到类声明中: protected:/AFX_MSG(CTreeCtrlX)/AFX_MSGafx_msg BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );DECLARE_MESSAGE_MAP()- 现在讨论这个函数本身的实现。为了适应不同的语言字符集,ANSI字符集和UNICODE字符集都必须被处理,处理过程会有些不同。此处对树形控件的本身产生的ToolTip消息不予处理,过滤掉上述消息的原则是树形控件本身产生的消息的ID是树形控件窗口的句柄,并且有TTF_IDISHWND标志。根据鼠标位置可以确定应该给出节点图标还是状态图标的工具提示。本文根据笔者画的图显示了一些无关紧要的提示,读者做这一步时应该加入一些有意义的提示。当然,本文假定控件包含节点图标和状态图标。如不包含,计算鼠标位置时要注意 不要计算错误。 BOOL CTreeCtrlX:OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )/ 需要处理ANSI和UNICODE两种格式TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;CString strTipText;UINT nID = pNMHDR- idFrom;/ 不必处理树自己发出的ToolTip消息if( nID = (UINT)m_hWnd &( pNMHDR- code = TTN_NEEDTEXTA & pTTTA- uFlags & TTF_IDISHWND ) |( pNMHDR- code = TTN_NEEDTEXTW & pTTTW- uFlags & TTF_IDISHWND ) ) )return FALSE;/ 得到鼠标位置const MSG* pMessage;CPoint pt;pMessage = GetCurrentMessage();ASSERT ( pMessage );pt = pMessage- pt;ScreenToClient( &pt );UINT nFlags;HTREEITEM hitem = HitTest( pt, &nFlags );if( nFlags & TVHT_ONITEMICON )int nImage, nSelImage;GetItemImage( (HTREEITEM ) nID, nImage, nSelImage );switch(nImage)case 0:strTipText = 叉;break;case 1:strTipText = 加号;break;case 2:strTipText = 菱形;break;elseif( (GetItemState( (HTREEITEM ) nID, TVIS_STATEIMAGEMASK ) 12 ) = 2 )strTipText.Format( 此节点被选中 );elsestrTipText.Format( 此节点未被选中 );#ifndef _UNICODEif (pNMHDR- code = TTN_NEEDTEXTA)lstrcpyn(pTTTA- szText, strTipText, 80);else_mbstowcsz(pTTTW- szText,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能家居橱柜定制安装服务合同协议书
- 说课课件教学
- 红酒收藏知识培训
- 2025年供用电合同范本模板
- 2025南京市存量房买卖版合同
- 红色小狗的课件
- 商业区域公共设施管理维护协议
- 农业科技研究与成果转化应用协议
- 诗经课件导语
- 红楼梦第8回课件赏析
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- GB/T 29245-2012信息安全技术政府部门信息安全管理基本要求
- GB/T 20863.1-2021起重机分级第1部分:总则
- GB/T 15171-1994软包装件密封性能试验方法
- 中药调剂技术-课件
- 水轮发电机讲义课件
- 姜黄素合成路线
- 安全教育:不私自离开幼儿园
- 泛光施工招标文件
- 刑法各论(第四版全书电子教案完整版ppt整套教学课件最全教学教程)
- 第7章:方差分析课件
评论
0/150
提交评论