如何在每次显示前更新工具提示文字?

问题描述 投票:5回答:2

如何使工具提示文本在每次显示前自动更新?

我有一个 CDialog 衍生的对话框,它使用 CToolTipCtrl 工具提示,而且工作得很好。

  • CToolTipCtrl 成员变量在我的 CDialog 类中的工具提示。
  • 创建工具提示并添加到 CDialog::OnInitDialog
  • 传给 CToolTipCtrlCDialog::PreTranslateMessage

我还知道如何在代码的各个地方使用以下方法更新工具提示文字。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();   
}
mfc dialog runtime tooltip
2个回答
3
投票

当调用 CToolTipCtrl::AddTool 使用 "特殊 "值 LPSTR_TEXTCALLBACK 作为工具提示的文本。这将导致该工具提示发布一个 TTN_NEEDTEXT 通知 父母 的窗口。然后,上级可以设置相应的文本。


1
投票

我自己好像也想明白了。由于在网上找不到解决方法,我就把它贴在这里供参考。如果有什么意见的话,还是希望大家多多指教。

我在下面的留言图中添加了一行字 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();
}

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

© www.soinside.com 2019 - 2024. All rights reserved.