Наконец-то! Я (частично) решил это:
Похоже, что родительское окно CDockablePane действительно вызвало эту проблему ...
Сначала я удалил весь специфичный для всплывающей подсказки код из класса, производного от CTreeCtrl. Все делается в окне родительской панели.
Затем я отредактировал метод родительского окна OnCreate()
:
int CMyPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
const DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
TVS_CHECKBOXES | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT |
TVS_INFOTIP | TVS_NOHSCROLL | TVS_SHOWSELALWAYS;
// TREECTRL_ID is a custom member constant, set to 1
if(!m_tree.Create(dwStyle, m_treeRect, this, TREECTRL_ID ) )
{
TRACE0("Failed to create trace tree list control.\n");
return -1;
}
// m_pToolTip is a protected member of CDockablePane
m_pToolTip->AddTool(&m_tree, LPSTR_TEXTCALLBACK, &m_treeRect, TREECTRL_ID);
m_tree.SetToolTips(m_pToolTip);
return 0;
}
К сожалению, мы не можем просто вызвать AddTool()
с меньшим количеством параметров, потому что базовый класс будет жаловаться в виде ASSERT
на член uFlag
, если не установлен идентификатор инструмента.
И так как нам нужно установить идентификатор, нам также нужно установить прямоугольник. Я создал элемент CRect
и установил его в (0, 0, 10000, 10000)
в CTor. Я еще не нашел рабочий способ изменить размер прямоугольника инструмента, так что это мой очень уродливый обходной путь. Вот почему я называю это решение частичным. Обновление: Я задал вопрос по этому поводу.
Наконец, есть обработчик для получения информации о всплывающей подсказке:
// Message map entry
ON_NOTIFY(TVN_GETINFOTIP, TREECTRL_ID, &CMobileCatalogPane::OnTvnGetInfoTip)
// Handler
void CMyPane::OnTvnGetInfoTip(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVGETINFOTIP pGetInfoTip = reinterpret_cast<LPNMTVGETINFOTIP>(pNMHDR);
// This is a CString member
m_toolTipText.ReleaseBuffer();
m_toolTipText.Empty();
// Set your text here...
pGetInfoTip->pszText = m_toolTipText.GetBuffer();
*pResult = 0;
}