TTNNEEDTEXT一般用法和高级用法OnToolTip函数.docx
- 文档编号:5222652
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:9
- 大小:20.03KB
TTNNEEDTEXT一般用法和高级用法OnToolTip函数.docx
《TTNNEEDTEXT一般用法和高级用法OnToolTip函数.docx》由会员分享,可在线阅读,更多相关《TTNNEEDTEXT一般用法和高级用法OnToolTip函数.docx(9页珍藏版)》请在冰豆网上搜索。
TTNNEEDTEXT一般用法和高级用法OnToolTip函数
TTN_NEEDTEXT一般用法和高级用法
2011-10-1413:
3028人阅读评论(0)收藏举报
ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法。
一般用法步骤:
添加CToolTipCtrl成员变量 m_tt。
在父窗口中调用EnableToolTips(TRUE);
在窗口的OnCreate(或者其他适当的位置)中向ToolTip中添加需要显示Tip的子窗口,并同时指定相应的显示字串CToolTipCtrl:
:
AddTool(pWnd,"string to display")。
重载父窗口的 BOOL PreTranslateMessage(MSG* pMsg) ,在函数中调用 m_tt.RelayEvent(pMsg)。
下面假设在窗口CWndYour中使用CToolTipCtrl
在类定义中添加变量说明:
class CWndYour:
xxx
{
CToolTipCtrl m_tt;
}
在OnCreate中添加需要显示Tip的子窗口
CWndYour:
:
OnCreate(....)
{
EnableToolTips(TRUE);
m_tt.Create(this);
m_tt.Activate(TRUE);
CWnd* pW=GetDlgItem(IDC_CHECK1);//得到窗口指针
m_tooltip.AddTool(pW,"Check1");//添加
........
}
在BOOL PreTranslateMessage(MSG* pMsg)中添加代码
BOOL CWndYour:
:
PreTranslateMessage(MSG* pMsg)
{
{
m_tt.RelayEvent(pMsg);
}
return CParentClass:
:
PreTranslateMessage(pMsg);
}
这样当鼠标移动到相应的子窗口上时会显示出相应的ToolTip。
动态改变ToolTip的显示内容的方法及步骤:
上面所讲的1、2、4步骤。
在增加ToolTip时不指定显示的字串,而是使用LPSTR_TEXTCALLBACK。
在窗口中增加消息映射 ON_NOTIFY_EX( TTN_NEEDTEXT, 0, SetTipText )。
在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText( UINT id, NMHDR * pTTTStruct, LRESULT * pResult ),下面的代码可以根据传入的参数判定应该显示的内容。
BOOL CWndYour:
:
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)
strcpy(pTTT->lpszText,your_string1);//设置
return TRUE;
break;
case(IDC_YOUR_CONTROL2)
//设置相应的显示字串
return TRUE;
break;
}
return(FALSE);
}
我用VC做TOOLTIP很多次了,但每次都要再研究一遍.虽然说学而时习,应该的,但主要还是由于自己懒.今天一定要记下来.以后再用的时候,就是参考.也请阅读此文的朋友记下来,将来查阅用.
用VC实现TOOLTIP.比较复杂,其实也简单,但MFC帮助一些窗口实现,而另一些窗口又不实现,倒搞得复杂了.最开始我用WM_MOUSEMOVE消息,然后用CToolTipCtrl:
:
Pop,这个方法太笨.不建议用.除非需要自定义.
MFC对TOOLTIP的支持不错的.缺省情况CFrameWnd支持很好.然后是CWnd.主要体现在TTN_NEEDTEXT消息的支持和OnToolHitTest的支持.TTN_NEEDTEXT是在CFrameWnd中支持的.OnToolHitTest是在CWnd中支持的.有了这些支持,可以在框架窗口中很好实现ToolBar的TIP.和在一个对话框中很好实现一个控件的TOOLTIP.
举例.在对话框中实现TOOLTIP.
1.EnableToolTips(TRUE)是不可少的.建议在:
CDialog:
:
OnInitDialog调用吧.
2.ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnNeedText).OnNeedText实现了TOOLTIP的文字.传入的参数idFrom是控件的ID,根据控件ID得到相应的TIP文字
就这么简单的两步,就实现了对话框中的TOOLTIP.其实不只对话框,任何窗口都可以用上面的方法实现自己的子窗口控件的TIP.但前提是必须是CWnd的派生类.
这就看出了MFC对TOOLTIP的支持很厉害
但这一切都是MFC实现的我们简单描述一下它的实现原理,这样看得更清楚
CWnd本身就带有一个CToolTipCtrl对象,是放在pThreadState中的这个不说了,知道CWnd有就行了
CWnd负责创建它,然后在PreTranslateMessage中调用了FilterToolTipMessage,这个函数的作用是处理WM_MOUSEMOVE,WM_NCMOUSEMOVE等消息,给CToolTipCtrl一个机会,判断鼠标是否在需要显示TIP的窗口上,如果是,就显示.FilterToolTipMessage先从CWnd:
:
OnToolHitTest得到TOOLINFO:
中的数据,比如哪个控件需要TIP等信息,然后利用ADDTOOL消息把这个需要TIP的控制加入到CToolTipCtrl的TOOL列表中,然后将鼠标移动的消息转给CToolTipCtrl处理.如果这个TIP的文字需要用回调函数来获得,就用WM_NOTIFY的TTN_NEEDTEXT从CToolTipCtrl的父窗口获取.这个过程就是CToolTipCtrl判断是否要显示TIP,到获得文字并显示TIP的全过程
这样一分析,就知道原来CWnd帮助实现了控件子窗口的TIP其实就是实现了OnToolHitTest这个函数,然后在PreTranslateMessage中转发消息,帮助CToolTipCtrl正确显示TIP.
而CFrameWnd是实现了TTN_NEEDTEXT的响应,帮助子窗口实现TIP.
其实我们也可以不要这些缺省实现,自己用CToolTipCtrl搞定,做法一样:
1.CToolTipCtrl:
:
Create创建ToolTip
2.AddTool增加一个TOOL,这里的TOOL就是需要显示TIP的一个区域或一个子窗口.如果对AddTool使用有不清楚的地方,建议查看源程序.可能会觉得直接使用TTM_ADDTOOL更方便.
3.在PreTranslateMessage中调用CToolTipCtrl:
:
RelayMessage
4.如果在AddTool中,文字是用回调函数实现,那就要处理TTN_NEEDTEXT消息.
其实自己创建CToolTipCtrl和MFC做的一样.只是不需要在OnToolHitTest中给出需要显示TIP的窗口或者区域.
如果给子窗口用TIP.就用MFC最简单.如果给自己呢?
设置TOOLINFO中的uFlags=TTF_IDISHWND,然后设置uId为窗口句柄,hWnd为窗口句柄就可以了.
写了这么多,有不对的地方还请和我联系一下,帮助我改正错误.
只是有个问题还没搞明白.就是为什么MFC把CToolTipCtrl放在了pThreadState中.难道是为了用一个TOOLTIP为该线程的所有窗口服务吗?
难道是一种节约资源的表现.这点还需要研究.如果哪位朋友知道答案,还希望能不吝赐教.谢谢.
用VC实现TOOLTIP2008-03-1713:
57按照下面的步骤去做:
1、先为static设置一个ID,如ID_TIP;
2、在CDialogBar的头文件中的AFX_MSG内加入一行申明
afx_msgBOOLOnToolTip(UINTid,NMHDR*pNMHDR,LRESULT*pResult);
3、在CDialogBar的CPP文件中的AFX_MSG_MAP内加入一行
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTip)
4、在CDialogBar的CPP文件中的OnInitDialog()函数内加入
EnableToolTips(TRUE);
5、在CDialogBar的CPP文件中添加OnToolTip函数
BOOLCDialogBar:
:
OnToolTip(UINTid,NMHDR*pNMHDR,LRESULT*pResult)
{
TOOLTIPTEXT*pTTT=(TOOLTIPTEXT*)pNMHDR;
UINTuID=pNMHDR->idFrom;
if(pTTT->uFlags&TTF_IDISHWND)
uID=:
:
GetDlgCtrlID((HWND)uID);
if(uID==NULL)returnFALSE;
switch(uID)
{
caseIDC_TIP:
pTTT->lpszText="添加你的提示内容";
break;
}
returnTRUE;
}
这样就可以了。
其实,上面的方法可以为任何控件添加tip提示。
用VC实现TOOLTIP.比较复杂,其实也简单,但MFC帮助一些窗口实现,而另一些窗口又不实现,倒搞得复杂了.最开始我用WM_MOUSEMOVE消息,然后用CToolTipCtrl:
:
Pop,这个方法太笨.不建议用.除非需要自定义.
MFC对TOOLTIP的支持不错的.缺省情况CFrameWnd支持很好.然后是CWnd.主要体现在TTN_NEEDTEXT消息的支持和OnToolHitTest的支持.TTN_NEEDTEXT是在CFrameWnd中支持的.OnToolHitTest是在CWnd中支持的.有了这些支持,可以在框架窗口中很好实现ToolBar的TIP.和在一个对话框中很好实现一个控件的TOOLTIP.
举例.在对话框中实现TOOLTIP.
1.EnableToolTips(TRUE)是不可少的.建议在:
CDialog:
:
OnInitDialog调用吧.
2.ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnNeedText).OnNeedText实现了TOOLTIP的文字.传入的参数idFrom是控件的ID,根据控件ID得到相应的TIP文字
就这么简单的两步,就实现了对话框中的TOOLTIP.其实不只对话框,任何窗口都可以用上面的方法实现自己的子窗口控件的TIP.但前提是必须是CWnd的派生类.
这就看出了MFC对TOOLTIP的支持很厉害
但这一切都是MFC实现的我们简单描述一下它的实现原理,这样看得更清楚
CWnd本身就带有一个CToolTipCtrl对象,是放在pThreadState中的这个不说了,知道CWnd有就行了
CWnd负责创建它,然后在PreTranslateMessage中调用了FilterToolTipMessage,这个函数的作用是处理WM_MOUSEMOVE,WM_NCMOUSEMOVE等消息,给CToolTipCtrl一个机会,判断鼠标是否在需要显示TIP的窗口上,如果是,就显示.FilterToolTipMessage先从CWnd:
:
OnToolHitTest得到TOOLINFO:
中的数据,比如哪个控件需要TIP等信息,然后利用ADDTOOL消息把这个需要TIP的控制加入到CToolTipCtrl的TOOL列表中,然后将鼠标移动的消息转给CToolTipCtrl处理.如果这个TIP的文字需要用回调函数来获得,就用WM_NOTIFY的TTN_NEEDTEXT从CToolTipCtrl的父窗口获取.这个过程就是CToolTipCtrl判断是否要显示TIP,到获得文字并显示TIP的全过程
这样一分析,就知道原来CWnd帮助实现了控件子窗口的TIP其实就是实现了OnToolHitTest这个函数,然后在PreTranslateMessage中转发消息,帮助CToolTipCtrl正确显示TIP.
而CFrameWnd是实现了TTN_NEEDTEXT的响应,帮助子窗口实现TIP.
其实我们也可以不要这些缺省实现,自己用CToolTipCtrl搞定,做法一样:
1.CToolTipCtrl:
:
Create创建ToolTip
2.AddTool增加一个TOOL,这里的TOOL就是需要显示TIP的一个区域或一个子窗口.如果对AddTool使用有不清楚的地方,建议查看源程序.可能会觉得直接使用TTM_ADDTOOL更方便.
3.在PreTranslateMessage中调用CToolTipCtrl:
:
RelayMessage
4.如果在AddTool中,文字是用回调函数实现,那就要处理TTN_NEEDTEXT消息.
其实自己创建CToolTipCtrl和MFC做的一样.只是不需要在OnToolHitTest中给出需要显示TIP的窗口或者区域.
如果给子窗口用TIP.就用MFC最简单.如果给自己呢?
设置TOOLINFO中的uFlags=TTF_IDISHWND,然后设置uId为窗口句柄,hWnd为窗口句柄就可以了.
写了这么多,有不对的地方还请和我联系一下,帮助我改正错误.
只是有个问题还没搞明白.就是为什么MFC把CToolTipCtrl放在了pThreadState中.难道是为了用一个TOOLTIP为该线程的所有窗口服务吗?
难道是一种节约资源的表现.这点还需要研究.如果哪位朋友知道答案,还希望能不吝赐教.谢谢
//头文件加入
CToolTipCtrlm_tooltip;
//主窗口初始化时加入
m_tooltip.Create(this);
m_tooltip.Activate(TRUE);
m_tooltip.AddTool(GetDlgItem(IDC_>name<),">text<");
//IDC_>name<为你控件的ID,>text<为显示的内容
利用ClassWizard建立PreTranslateMessage
BOOLCTest5Dlg:
:
PreTranslateMessage(MSG*pMsg)
{
m_tooltip.RelayEvent(pMsg);//你加入的代码
returnCDialog:
:
PreTranslateMessage(pMsg);
}
如何用VC++实现在对话框的控件上显示ToolTip并在状态条上显示控件的信息
湖南省邮电五二六厂
肖天鹏
----利用VC++的AppWizard,可以很容易地实现工具条和菜单项的ToolTip或在状态条上显示帮助信息,但要在对话框的控件上显示ToolTip并在状态条上显示控件信息并不是那么容易,其实,利用VC++中的WM_SETCURSOR与TTN_NEEDTEXT消息就可达到目的。
具体操作如下:
----一
----利用VC++的MFCAppWizard生成一个SDI或MDI的应用程序
----二
----编辑对话框控件的字符串资源
----例如:
----IDC_DBBUTTON1="thisis肖天鹏的第一自制按钮\n天鹏",其中字符串"thisis肖天鹏的第一自制按钮"将在鼠标移到控件上时显示在状态条上,字符串"天鹏"将作为ToolTip显示。
----三
----建立消息映射。
----在对话框的头文件(*.H)中加入以下代码:
protected:
voidSetStatusText(UINTnID=0);
//{{AFX_MSG(CFileOp1)
afx_msgvoidOnDestroy();
afx_msgBOOLOnSetCursor(CWnd*pWnd,
UINTnHitTest,UINTmessage);
//}}AFX_MSG
afx_msgBOOLOnTipNotify(UINTid,NMHDR*
pNMHDR,LRESULT*pResult);
DECLARE_MESSAGE_MAP()
----在对话框的实现文件(*.CPP)中加入以下代码:
BEGIN_MESSAGE_MAP(CFileOp1,CDialog)
//{{AFX_MSG_MAP(CFileOp1)
ON_WM_DESTROY()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnTipNotify)
END_MESSAGE_MAP()
----四
----编辑消息处理函数。
BOOLCFileOp1:
:
OnSetCursor
(CWnd*pWnd,UINTnHitTest,UINTmessage)
{
//TODO:
Addyourmessagehandler
codehereand/orcalldefault
if(pWnd==this)
SetStatusText();
else
{
TOOLTIPTEXTm_psttt;
m_psttt.hdr.hwndFrom=m_hWnd;
m_psttt.hdr.idFrom=pWnd->GetDlgCtrlID();
m_psttt.hdr.code=TTN_NEEDTEXT;
m_psttt.uFlags=TTF_IDISHWND;
SetStatusText(pWnd->GetDlgCtrlID());
this->SendMessage(WM_NOTIFY,
m_psttt.hdr.idFrom,(LPARAM)&m_psttt);
}
returnCDialog:
:
OnSetCursor
(pWnd,nHitTest,message);
}
voidCFileOp1:
:
OnDestroy()
{
SetStatusText();
CDialog:
:
OnDestroy();
}
voidCFileOp1:
:
SetStatusText(UINTnID)
{
if(nID==0)
nID=AFX_IDS_IDLEMESSAGE;
CWnd*pWnd=AfxGetMainWnd()->GetDescendantWindow
(AFX_IDW_STATUS_BAR);
if(pWnd)
{
AfxGetMainWnd()->SendMessage
(WM_SETMESSAGESTRING,nID);
pWnd->SendMessage(WM_IDLEUPDATECMDUI);
pWnd->UpdateWindow();
}
}
BOOLCFileOp1:
:
OnTipNotify(UINTid,NMHDR*
pNMHDR,LRESULT*pResult)
{
TOOLTIPTEXT*pTTT=(TOOLTIPTEXT*)pNMHDR;
UINTnID=pNMHDR->idFrom;
if(pTTT->uFlags&TTF_IDISHWND)
{
nID=:
:
GetDlgCtrlID((HWND)nID);
if(nID)
{
TCHARszFullText[256];
CStringStrTipText;
AfxLoadString(nID,szFullText);
AfxExtractSubString(StrTipText,
szFullText,1,'\n');
if(!
StrTipText.IsEmpty())
strcpy(pTTT- >lpszText,StrTipText);
pTTT- >hinst=AfxGetResourceHandle();
return(TRUE);
}
}
return(FALSE);
}
----
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TTNNEEDTEXT 一般 用法 高级 OnToolTip 函数