自定义tooltip,python tooltip

  自定义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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: