5

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

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

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

我也知道如何在代码的各个地方使用CToolTipCtrl::UpdateTipText和更新工具提示文本CToolTipCtrl::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();   
}
4

2 回答 2

3

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

于 2013-01-31T22:28:04.997 回答
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();
}

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

于 2013-02-06T07:35:53.440 回答