Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Всплывающие подсказки в ListCtrl'е


Автор: AndreySol 15.10.2006, 09:44
Дайте пример как правильно сделать всплывающие подсказки для ListCtrl'а, расположенного на диалоге. Пробовал сделать так:
В OnInitDialog создаю
Код

m_tooltip.Create(this);
m_tooltip.SetDelayTime(500);
m_tooltip.Activate(TRUE);

далее, в PreTranslateMessage
Код

m_tooltip.RelayEvent(pMsg);

далее в OnNotify
Код

NMHDR *lpNMHDR = (NMHDR*) lParam;

// устанавливаю текст подсказки
if(lpNMHDR->code == LVN_GETINFOTIP)
{
    // для примера
    CString szToolTipText = "String 1\nString 2\nString 3\nString 4";

    // получаем указатель на структуру для подсказок
    NMLVGETINFOTIP* infotip = (NMLVGETINFOTIP*) lpNMHDR;

    infotip->dwFlags = 0;
    infotip->cchTextMax = szToolTipText.GetLength();
    infotip->pszText = (LPTSTR) (LPCTSTR) 

szToolTipText.GetBuffer(szToolTipText.GetLength());
}

В результате получаются кракозяблики. Подозреваю что причина может быть связана с UNICODE, но не знаю как правильно сделать.
Помогите.

Автор: Earnest 15.10.2006, 15:52
Скорее, дело в том, что ты возвращаешь указатель на авто-объект. Попробуй сделать строку статической.
И зачем тебе дополнительный тултип в диалоге? У лист-контрола свой собственный есть.

Автор: AndreySol 17.10.2006, 06:28
Цитата

У лист-контрола свой собственный есть. 

А как его правильно использовать ?

Автор: Earnest 20.10.2006, 10:01
Смотря чего ты хочешь. А вообще, добраться до родного тултип-контрола можно так: GetToolTips. Тольео имей в виду: возвращается врменное окно, так что хранить можно только его hwnd.

Добавлено @ 10:05 
Я хотела сказать, что не нужно тебе создавать дополнительный тултип-контрол. Достаточно обрабатывать LVN_GETINFOTIP.

Автор: AndreySol 21.10.2006, 06:48
Так я вроде LVN_GETINFOTIP и обрабатываю, вот только почему кракозяблики ?
Может все-же infotip->pszText нуна по-другому заполнять ?

Автор: Earnest 23.10.2006, 07:52
Я же писала вверху: у тебя запиоминается указатель на временную строку. При выходе из функции она разрушается. Не факт, но если указатель не используется сразу же, то это и есть причина. Попробуй для начала сделать строку статической.

Автор: AndreySol 29.10.2006, 03:50
Вот так все заработало:
Код

infotip->cchTextMax = szToolTipText.GetLength();
_tcscpy(infotip->pszText, szToolTipText);

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