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

时间:2013-01-29 15:16:19

标签: mfc dialog runtime tooltip

每次显示(即将展示)工具提示时,如何使工具提示文本自动更新?

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

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

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

更新代码的各个位置的toolTip文本

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

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

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();   
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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检查toolTip是否来自特定的CToolTipCtrl。