Re[2]: CMultiDocTemplate dll проблема с сообщениями в строке
От: alexhack  
Дата: 08.02.07 21:32
Оценка:
Спасибо Павел за такой нужный отклик.
Сразу скажу у меня 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.