Спасибо Павел за такой нужный отклик.
Сразу скажу у меня NET2003, но разница не большая.
Вот что получилось.
В методе
OnCreate(LPCREATESTRUCT lpCreateStruct)
я вызвал в соответствии с MSDN вызов
EnableToolTips(TRUE);
Далее в cpp добавил
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
В h добавил
afx_msg BOOL OnToolTipText(UINT msg, NMHDR* pNMHDR, LRESULT* pResult);
Тело функции в классе унаследованного от CMDIChildWnd
Добавленный мной код выделен жирным шрифтом,
курсивом проверку без которой все упадет.
Опытнымпутем выяснил, что для одного ID функция у меня вызывается,подчеркиваю, кажется 4 раза.
BOOL ...::OnToolTipText(UINT msg, NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
UNUSED(pNMHDR);
// check to see if the message is going directly to this window or not
const MSG* pMsg = GetCurrentMessage();
if (pMsg->hwnd != m_hWnd)
{
// let top level frame handle this for us
return FALSE;
}
if(pNMHDR->code == TTN_NEEDTEXT)
{
UINT nID =pNMHDR->idFrom;
//Следующий вызов обязателен,
//если строковый ресурс подсказка,
//так же как и сам этот код находятся в dll(MFCEXT)
//Его действие распространяется на блок в рамках которого он вызван
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE l_hInst = AfxFindStringResourceHandle(nID);
//Тут все ястно, если хандл ресурса найден, значит работаем с ним.
if(l_hInst)
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
pTTT->lpszText = MAKEINTRESOURCE(nID);
pTTT->hinst = l_hInst;
return(TRUE);
}
}
//Иначе так
return CFrameWnd::OnToolTipText(msg, pNMHDR, pResult);
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>