Add a member to the CDialog or CWnd derived class in the header like: CToolTipCtrl CTTDialog :: m_ToolTip;In the OnInitDialog or OnInitialUpdate, add: m_ToolTip.Create (this); m_ToolTip.Activate (TRUE);CWnd* pWnd = GetWindow (GW_CHILD); while (pWnd) { int nID = pWnd->GetDlgCtrlID (); if (nID != -1) { m_ToolTip.AddTool (pWnd, pWnd->GetDlgCtrlID ()); } pWnd = pWnd->GetWindow (GW_HWNDNEXT); }To add a tooltip to a control, just add a string resource using the same ID as the control to get the tip. If I wanted the OK button to have a tip, I would add a string resource for IDOK.Also do not forget to put the following code to you dialog class: BOOL CTTDialog :: PreTranslateMessage(MSG* pMsg) { if (m_hWnd) { m_ToolTip.RelayEvent (pMsg); return CDialog::PreTranslateMessage(pMsg); } return (FALSE); }
2、然后增加一个消息函数定义:
afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult);
3、增加消息映射:
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText);
4、消息函数实现:
………………………………
TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
CString strTipText;
UINT uID = pNMHDR->idForm;
if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA ->uFlags & TTF_IDISHWND_\) || pNMHDR->code == TTN_NEADTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
uID = ::GetDlgCtrlID((HWND)uID); //idForm位工具栏的HWND
if(uID != 0) //不为分割符
{
strTipText.LoadString(uID);
strTipText = strTip.Mid(strTipText.Find('\n', 0) + 1);#ifndef _UNICODE
if(pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#else
if(pNMHDR->code == TTN_NEEDTEXTW)
_wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTW->szText));
else
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#endif *pResult = 0;
::SetWindowPos(pNMHDR->hwndForm, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
return TRUE;
}
return TRUE;
}
我把这个程序块放进程序里,但是提示还是没有出来
我想请教您几个问题:
TOOLTIPTEXTA *pTTTA = (TOOLTIPTEXTA *)pNMHDR;
TOOLTIPTEXTW *pTTTW = (TOOLTIPTEXTW *)pNMHDR;
CString strTipText;
UINT uID = pNMHDR->idForm;
if(pNMHDR->code == TTN_NEEDTEXTA && (pTTTA ->uFlags & TTF_IDISHWND_\) || pNMHDR->code == TTN_NEADTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
uID = ::GetDlgCtrlID((HWND)uID); //此时得到是对话条中的标识符个数
if(uID != 0) //不为分割符
{
strTipText.LoadString(uID); //是取出了string资源中的所有字串吗?msdn中讲是通过ID区分这些字符串的,把字符串放到一个事先准备的字串里,是这样的吗?那不是乱七八糟的了吗?
strTipText = strTip.Mid(strTipText.Find('\n', 0) + 1);#ifndef _UNICODE
if(pNMHDR->code == TTN_NEEDTEXTA)
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
else
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#else
if(pNMHDR->code == TTN_NEEDTEXTW)
_wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTW->szText));
else
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
#endif *pResult = 0; //干什么用的?
::SetWindowPos(pNMHDR->hwndForm, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER);
return TRUE;
}
return TRUE;
}
m_ToolTip.Create (this);
m_ToolTip.Activate (TRUE);CWnd* pWnd = GetWindow (GW_CHILD);
while (pWnd)
{
int nID = pWnd->GetDlgCtrlID ();
if (nID != -1)
{
m_ToolTip.AddTool (pWnd, pWnd->GetDlgCtrlID ());
}
pWnd = pWnd->GetWindow (GW_HWNDNEXT);
}To add a tooltip to a control, just add a string resource using the same ID as the control to get the tip. If I wanted the OK button to have a tip, I would add a string resource for IDOK.Also do not forget to put the following code to you dialog class:
BOOL CTTDialog :: PreTranslateMessage(MSG* pMsg)
{
if (m_hWnd)
{
m_ToolTip.RelayEvent (pMsg);
return CDialog::PreTranslateMessage(pMsg);
}
return (FALSE);
}