如何使工具提示文本在每次显示前自动更新?
我有一个 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();
}
当调用 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发送。我的函数中的if-check检查工具提示是否来自特定的CToolTipCtrl。