自定义tooltip,python tooltip
我用VC做过很多次工具提示,但是每次都要重新学习一遍。虽然边学边学没错,但主要是我懒。我今天必须把它写下来。以后再用的时候,供参考。也请看过这篇文章的朋友写下来,以备日后参考。
用VC实现工具提示很复杂,但其实很简单。但是,MFC帮助一些窗口实现,而另一些不实现,这使得它很复杂。一开始我用的是WM_MOUSEMOVE message,然后是ctoolipctrl:Pop,太蠢了。不推荐。除非需要定制。
MFC工具提示得到了很好的支持。默认情况下,CFrameWnd支持的很好,然后是CWnd。主要体现在对TTN_NEEDTEXT消息和Ontoolwittest的支持上。CFrameWnd支持TTN_NEEDTEXT,CWnd支持Ontoolwittest。有了这些支持,工具栏的提示可以很好的在框架窗口中实现,对话框也可以很好的实现。
举例。在对话框中实现工具提示。
1.EnableToolTips( TRUE)是必不可少的。建议在:CDialog:OnInitDialog中调用。
2.on _ notify _ ex (ttn _ needtext,0,on need text)。onneedext实现工具提示的文本。传递的参数idFrom是控件的ID,根据控件ID获取对应的提示文本。
在这样简单的两步中,对话框中的工具提示就实现了。其实不仅仅是对话框,任何窗口都可以用上面的方法实现自己子窗口控件的提示,但前提是必须是CWnd的派生类。
这说明MFC对工具提示的支持非常好。
但这一切都是用MFC实现的。先简单描述一下它的实现原理,这样可以看得更清楚。
CWnd本身带有一个CToolTipCtrl对象,该对象放在pThreadState中。算了,知道CWnd有就行了。
CWnd负责创建它,然后在PreTranslateMessage中调用FilterToolTipMessage。该函数用于处理WM_MOUSEMOVE、WM_NCMOUSEMOVE等消息,给CToolTipCtrl一个判断鼠标是否在需要显示提示的窗口上的机会。如果是,它会显示。FilterToolTipMessage。首先获取TOOL info:from CWnd:OnToolHitTest中的数据,比如哪个控件需要TIP,然后使用ADDTOOL消息将需要TIP的控件添加到CToolTipCtrl的工具列表中。然后将鼠标移动的消息传递给CTOOLTIPTRL进行处理。如果这个提示的文本需要通过回调函数获取,使用WM_NOTIFY的TTN_NEEDTEXT从CTOOLTIPTRL的父窗口获取。这个过程就是从CTOOLTIPTRL判断是否显示提示到获取文本并显示提示的整个过程。
从这个分析中我们可以知道,CWnd帮助实现了控件子窗口的提示,其实就是OnToolHitTest的函数,然后在PreTranslateMessage中转发消息,帮助CToolTipCtrl正确显示提示。
而CFrameWnd是实现TTN_NEEDTEXT的响应,帮助子窗口实现TIP。
事实上,我们可以自己用CToolTipCtrl做这件事,而不用这些默认的实现,并且做同样的事情:
1.1.CToolTipCtrl:创建创建工具提示
2.向AddTool添加一个工具,其中工具是需要显示提示的区域或子窗口。如果对AddTool的使用有不清楚的地方,建议查一下源程序。你可能会发现直接使用TTM _添加工具更方便。
3.在PreTranslateMessage中调用CTOOLTIPTRL: RelayMessage
4.如果文本是由AddTool中的回调函数实现的,那么应该处理TTN_NEEDTEXT消息。
其实自己创建CToolTipCtrl和MFC的一样,只是不需要在OnToolHitTest中给出提示需要显示的窗口或区域。
如果你使用子窗口的提示,使用MFC是最简单的。如果给自己呢?
在TOOLINFO中设置uFlags=TTF_IDIShWnd,然后设置uId为窗口句柄,hWnd为窗口句柄。
写了这么多,如有错误请联系我,帮我改正。
只是有个问题还没弄清楚。这也是MFC将CToolTipCtrl放在pThreadState中的原因。是用一个工具头服务这个线程的所有窗口吗?是节约资源的表现吗?这一点还是需要研究的。如果有朋友知道答案,请不吝赐教。谢谢你。
- 2 -
ToolTip是Win32中的一个通用控件,MFC中为它生成了一个类CToolTipCtrl。总的来说,它的使用方法比较简单。先说一下它的一般用法和高级用法。
一般使用步骤:
添加CToolTipCtrl成员变量m_tt。
在父窗口中调用EnableToolTips(TRUE );
在窗口的OnCreate(或者其他合适的位置)中,将需要显示提示的子窗口添加到工具提示中,并指定相应的显示字符串ctooltiprl:add tool(pwnd, string to display )。
重载父窗口的boolPretranslateMessage(msg * pmsg),调用m_tt。函数中的RelayEvent(pMsg)。
我们假设在窗口CWndYour中使用了CToolTipCtrl。
将变量描述添加到类定义中:
你的班级:xxx
{
TT;
}
在OnCreate中添加一个显示提示的子窗口。
cwndhour:OnCreate(.)
{
enable tooltips(TRUE);
tt。创造(这个);
tt。激活(真);
CWnd * pW=GetDlgItem(IDC _ check 1);//获取窗口指针
m _工具提示。AddTool(pW, check 1 );//添加
.
}
在bool pretranslate message(msg * pmsg)中添加代码
BOOL cwndhour:PreTranslateMessage(MSG * pMsg)
{
{
tt。relay event(pMsg);
}
返回CParentClass:PreTranslateMessage(pMsg);
}
这样,当鼠标移动到相应的子窗口上时,就会显示相应的工具提示。
动态改变工具提示显示内容的方法和步骤:
上面提到的步骤1、2和4。
添加工具提示时,不要指定显示的字符串,而是使用LPSTR_TEXTCALLBACK。
在窗口中添加消息映射on _ notify _ ex (ttn _ needtext,0,settiptext)。
在窗口中添加一个函数,动态提供显示的内容。它的原型是Bool Set TipText (UINT ID,NMHDR * PTTTSTRUCT,LRESULT * PRESULT)。下面的代码可以根据传递的参数确定应该显示什么。
BOOL cwndhour:SetTipText(UINT id,NMHDR * pTTTStruct,LRESULT * pResult)
{
tooltip text * pTTT=(tooltip text *)pTTT struct;
UINT nID=pttt struct-id from;//获取对应的窗口ID,可能是HWND
If (pTTT- uFlags TTF_IDISHWND) //表示nID是否为HWND
{
nID=:GetDlgCtrlID((HWND)nID);//从HWND获取ID值。当然也可以通过HWND值来判断
开关(nID)
案例(IDC_YOUR_CONTROL1)
strcpy(pTTT- lpszText,your _ string 1);//设置
返回TRUE
打破;
案例(IDC_YOUR_CONTROL2)
//设置相应的显示字符串
返回TRUE
打破;
}
返回(假);
}
ToolTip是Win32中的一个通用控件,MFC中为它生成了一个类CToolTipCtrl。总的来说,它的使用方法比较简单。先说一下它的一般用法和高级用法。
一般使用步骤:
添加CToolTipCtrl成员变量m_tt。
在父窗口中调用EnableToolTips(TRUE );
在窗口的OnCreate(或者其他合适的位置)中,将需要显示提示的子窗口添加到工具提示中,并指定相应的显示字符串ctooltiprl:add tool(pwnd, string to display )。
重载父窗口的boolPretranslateMessage(msg * pmsg),调用m_tt。函数中的RelayEvent(pMsg)。
我们假设在窗口CWndYour中使用了CToolTipCtrl。
将变量描述添加到类定义中:
你的班级:xxx
{
TT;
}
在OnCreate中添加一个显示提示的子窗口。
cwndhour:OnCreate(.)
{
enable tooltips(TRUE);
tt。创造(这个);
tt。激活(真);
CWnd * pW=GetDlgItem(IDC _ check 1);//获取窗口指针
m _工具提示。AddTool(pW, check 1 );//添加
.
}
在bool pretranslate message(msg * pmsg)中添加代码
BOOL cwndhour:PreTranslateMessage(MSG * pMsg)
{
{
tt。relay event(pMsg);
}
返回CParentClass:PreTranslateMessage(pMsg);
}
这样,当鼠标移动到相应的子窗口上时,就会显示相应的工具提示。
动态改变工具提示显示内容的方法和步骤:
上面提到的步骤1、2和4。
添加工具提示时,不要指定显示的字符串,而是使用LPSTR_TEXTCALLBACK。
在窗口中添加消息映射on _ notify _ ex (ttn _ needtext,0,settiptext)。
在窗口中添加一个函数,动态提供显示的内容。它的原型是Bool Set TipText (UINT ID,NMHDR * PTTTSTRUCT,LRESULT * PRESULT)。下面的代码可以根据传递的参数确定应该显示什么。
BOOL cwndhour:SetTipText(UINT id,NMHDR * pTTTStruct,LRESULT * pResult)
{
tooltip text * pTTT=(tooltip text *)pTTT struct;
UINT nID=pttt struct-id from;//获取对应的窗口ID,可能是HWND
if (pTTT- uFlags TTF_IDISHWND) //表明突边是否为HWND
{
nID=:GetDlgCtrlID((HWND)nID);//从HWND得到身份值,当然你也可以通过HWND值来判断
开关(nID)
案例(IDC_YOUR_CONTROL1)
strcpy(pTTT- lpszText,your _ string 1);//设置
返回真实的
打破;
案例(IDC_YOUR_CONTROL2)
//设置相应的显示字串
返回真实的
打破;
}
返回(假);
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。