每次显示前如何更新 ToolTip 文本?

Posted

技术标签:

【中文标题】每次显示前如何更新 ToolTip 文本?【英文标题】:How to update ToolTip text each time before display? 【发布时间】:2013-01-29 15:16:19 【问题描述】:

如何让工具提示文本在每次(即将)显示工具提示时自行更新?

我有一个 CDialog 派生对话框,它以通常的方式使用 CToolTipCtrl 工具提示,它工作得很好:

我的 CDialog 类中的 CToolTipCtrl 成员变量。 创建工具提示并添加到 CDialog::OnInitDialog 中的工具 消息转发到 CDialog::PreTranslateMessage 中的 CToolTipCtrl

我也知道如何使用 CToolTipCtrl::UpdateTipTextCToolTipCtrl::Update

来更新代码不同位置的工具提示文本

但是,我想要但尚未完成的是: 我希望在显示相应的工具提示之前每次鼠标悬停在工具上时更新工具提示的文本,即显示的文本取决于显示工具提示文本时的情况。

到目前为止我的工作代码(截断到相关行):

class CmyDialog : public CDialog

  virtual BOOL OnInitDialog();
  virtual BOOL PreTranslateMessage(MSG* pMsg);
  virtual void RefreshToolTipText();        // Want to call this prior each display

  CToolTipCtrl m_toolTip;


BOOL CmyDialog::OnInitDialog()

  CDialog::OnInitDialog();
  m_toolTip.Create(this);
  m_toolTip.AddTool( GetDlgItem(IDC_SOMECONTROLID), "Sometext" );
  m_toolTip.Activate( TRUE );


BOOL CmyDialog::PreTranslateMessage(MSG* pMsg)

  if(IsWindow(m_toolTip.m_hWnd)) 
     m_toolTip.RelayEvent(pMsg); 


void CmyDialog::RefreshToolTipText()

  m_toolTip.UpdateTipText( "updated runtime text",  GetDlgItem(IDC_SOMECONTROLID) );
  m_toolTip.Update();   

【问题讨论】:

我想我已经找到了解决方案,但作为一个新用户,我无法在接下来的 6 小时内发布答案 :c)。明天会这样做... 【参考方案1】:

调用CToolTipCtrl::AddTool 时,使用“特殊”值LPSTR_TEXTCALLBACK 作为工具提示的文本。这将导致工具提示向您要为其添加工具提示的窗口的 发布TTN_NEEDTEXT 通知。然后,父母可以相应地设置文本。

【讨论】:

感谢您的回答。如上所述,我找到了一个似乎已经有效的解决方案。不需要设置 LPSTR_TEXTCALLBACK,也许它是默认值?如果您对我的上述解决方案有一些 cmets,我很想听听他们。仍在学习...(PS:不能以少于 15 个代表来投票您的答案:c)但是谢谢!) 您的解决方案会起作用,但一般来说,根据文档,处理它的“正确”方法是使用回调并响应TTN_NEEDTEXT。但是,如果您的解决方案适用于您的目的,那就太好了!不用担心投票 - 不是为了投票;)【参考方案2】:

我似乎自己也想通了。由于我无法在线找到解决方案,因此我将在此处发布以供参考。如果有的话,我仍然会感谢 cmets。

我在 CmyDialog 类的消息映射中添加了以下行:

BEGIN_MESSAGE_MAP(CmyDialog, CDialog)
   ON_NOTIFY( TTN_SHOW, 0, OnToolTipTextAboutToShow )   
END_MESSAGE_MAP()

我在 CmyDialog 中添加了以下成员函数:

void CmyDialog::OnToolTipTextAboutToShow(NMHDR * pNotifyStruct, LRESULT* result)

   if ( pNotifyStruct->hwndFrom == m_toolTip.m_hWnd )
       RefreshToolTipText();

显然,每次将要显示工具提示时,都会通过 WM_NOTIFY 发送 TTN_SHOW 通知代码。我的函数中的 if-check 检查工具提示是否来自特定的 CToolTipCtrl。

【讨论】:

注释:在 RefreshToolTipText() 中使用 m_toolTIP.Update() 不是一个好主意,以防工具提示窗口需要更改大小(即多行工具提示在 2 到 3 行之间变化.) 我必须在代码中规避这一点,否则当代码进入无限循环时可能会看到崩溃。

以上是关于每次显示前如何更新 ToolTip 文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确更新 AppWidget?

点击时更改 Bootstrap-vue Tooltip 的文本

Qt Tooltip如何防止文本在内置延迟后消失?

谈谈文本出现省略号和tooltip相爱相杀的那些事

[WPF]TextTrimming截断后,ToolTip显示完整信息

C# button或LABEL鼠标放上去显示的文本在哪里属性设置