Как обновить текст подсказки каждый раз перед отображением?


Как сделать так, чтобы текст всплывающей подсказки обновлялся каждый раз, когда она будет отображаться ?

У меня есть CDialog производный диалог, который использует CToolTipCtrl подсказки обычным способом, и он работает просто отлично:

  • CToolTipCtrl переменная-член в моем классеCDialog .
  • создана всплывающая подсказка и добавлена в инструмент в CDialog:: OnInitDialog
  • сообщение, переданное в CToolTipCtrl в CDialog:: 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();   
}
2 2

2 ответа:

При вызове CToolTipCtrl::AddTool используйте "специальное" значение LPSTR_TEXTCALLBACK в качестве текста для подсказки. Это приведет к тому, что всплывающая подсказка отправит уведомление TTN_NEEDTEXT родителю окна, для которого вы добавляете всплывающую подсказку. Затем родитель может настроить текст соответствующим образом.

Кажется, я и сам это понял. Поскольку я не смог найти решение в Интернете, я собираюсь разместить его здесь для ссылок. Я все равно был бы признателен за комментарии, если они есть.

Я добавил следующую строку карта сообщений класса 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 каждый раз, когда всплывающая подсказка собирается появиться. Если-проверьте в моем функция проверяет, что подсказка из конкретного CToolTipCtrl.