Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос по Tooltip в ListCtrl.


Автор: AndreySol 26.8.2004, 05:57
У меня проблема с всплывающими подсказками для 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.
Здесь сама статья.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)