У меня проблема с всплывающими подсказками для ListCtrl. Есть два контрола - ListCtrl и TreeCtrl. Для них унаследованы классы CMyListCtrl от CListCtrl и CMyTreeCtrl от TreeCtrl, каждый привязан через переменную к этому окну. И есть такая реализация всплывающих подсказок (tooltip) в этих окнах, абсолютно одинаковая для обоих: в MyListCtrl.h (MyTreeCtrl.h)объявлены функции и переменные:
| Код | BOOL OnToolTipText( UINT id, NMHDR * pNMHDR, LRESULT * pResult ); int IndexItem; // ListCtrl HTREEITEM IndexItem; // для TreeCtrl
|
в MyListCtrl.cpp (MyTreeCtrl.cpp): карта сообщений
| Код | BEGIN_MESSAGE_MAP(CMyListCtrl(CMyTreeCtrl), CListCtrl(MyTreeCtrl)) //{{AFX_MSG_MAP(CMyListCtrl(CMyTreeCtrl)) ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText) // это добавлено ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) // это добавлено END_MESSAGE_MAP()
|
далее сама реализация вывода всплывающих подсказок:
| Код | void CMyListCtrl(CMyTreeCtrl)::PreSubclassWindow() { EnableToolTips(TRUE); // поддержка tooltip CListCtrl(CMyTreeCtrl)::PreSubclassWindow(); }
void CMyListCtrl(CMyTreeCtrl)::OnMouseMove(UINT nFlags, CPoint point) { // получаем номер итема под мышью {// это для ListCtrl UINT uFlags; int Index; Index = HitTest(point, &uFlags); if((uFlags == LVHT_ONITEMLABEL) | (uFlags == LVHT_ONITEMICON)) { IndexItem = Index; } else { IndexItem = -1; } }
{// это для TreeCtrl UINT uFlags; HTREEITEM Index; Index = HitTest(point, &uFlags); if((uFlags == LVHT_ONITEMLABEL) | (uFlags == LVHT_ONITEMICON)) { IndexItem = Index; } else { IndexItem = NULL; } }
CListCtrl(CTreeCtrl)::OnMouseMove(nFlags, point); }
BOOL CMyListCtrl(CMyTreeCtrl)::OnToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult) { // для ANSI и UNICODE версий TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
UINT nID = pNMHDR->idFrom;
CString strTipText; // получаем текст подсказки strTipText = GetItemText(IndexItem, 0); // для ListCtrl strTipText = GetItemText(IndexItem); // для TreeCtrl
// передаем в структуру ToolTip #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, strTipText, 80); else _mbstowcsz(pTTTW->szText, strTipText, 80); #else if (pNMHDR->code == TTN_NEEDTEXTA) _wcstombsz(pTTTA->szText, strTipText, 80); else lstrcpyn(pTTTW->szText, strTipText, 80); #endif
*pResult = 0;
return TRUE; // message was handled }
|
А теперь собственно проблема - для TreeCtrl все работает прекрасно, а вот для ListCtrl окно подсказки мигает так что даже текст трудно заметить. Как с этим бороться ? Заранее Всем спасибо за ответы и подсказки. P.S. код я состряпал на основе статьи "Tooltip for individual cells" с www.codeguru.com. Здесь сама статья. |