Как обновить текст подсказки каждый раз перед отображением?
Как сделать так, чтобы текст всплывающей подсказки обновлялся каждый раз, когда она будет отображаться ?
У меня есть 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 ответа:
При вызове
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.