Страница 1 из 2

ToolTip control срабатывает только 1 раз

Добавлено: 31 авг 2005, 20:15
Sera
Обнаружилась странная вещь, никак не могу разобраться, в чем же дело.
Использую WinAPI ToolTip control.
Create, Addtool, Activate, устанавливаю текст. В обработке сообщений пересылаю RelayEvent.

Вобщем, подключаю ToolTip к моему окну.
Теперь делаю так: навожу мышь на контрол и фиксирую ее там на 10-15 секунд, пока не пропадет всплывший тултип. После этого тултип больше не появляется, сколько мышой не води, не крути, не подводи снова... :/ меня это ставит в тупик.

Такое же поведение обружилось на WTL::HyperLink tooltip-е.

Дело в том, что у меня в приложение уже есть один созданный тултип, который появляется для кнопки. Он работает нормально. А вот для этого кастом-окна -- ерунда выходит!

Может, есть идеи?
Спасибо большое.

Добавлено: 01 сен 2005, 10:18
Hawk
Пришли пример как ты его инициализируешь и переправляешь сообщения

Добавлено: 01 сен 2005, 12:02
Sera

Код: Выделить всё

class CMyClass : public MFC::CWnd
{
//...
   CToolTipCtrl			m_tip;
};

CMyClass::OnCreate
{
   m_tip.Create(this);
   m_tip.AddTool(this);
   m_tip.Activate(TRUE);

   m_tip.UpdateTipText( szToolTipText, this );
}

CMyClass::PreTranslateMessage
{
   m_tip.RelayEvent(pMsg);
   //...
}


Добавлено: 01 сен 2005, 12:12
Sera
Если найдутся любопытствующие, то могу подкинуть пример:

в
http://www.codeproject.com/wtl/wtl4mfc5.asp
скачать download demo proejct (81 kb).
Запустить прогу и попробовать подержать курсор мыши над линкой "Visit codeproject". После того, как тултип исчезнет сам, он больше не появляется.

Там и сорцы есть.

Добавлено: 03 сен 2005, 14:00
Eugie
Sera, фильтруй пересылаемые сообщения в PreTranslateMessage:

Код: Выделить всё

...
if(pMsg->message== WM_LBUTTONDOWN ||
   pMsg->message== WM_LBUTTONUP ||
   pMsg->message== WM_MOUSEMOVE)
m_tip.RelayEvent(pMsg);
...

Добавлено: 05 сен 2005, 18:09
Sera
Euqie, фильтровать сообщения, конечно, хорошо и правильно, но это совсем не решает мою задачу, да и не относится к ней.

Народ! Неужели никто не встречался с такой проблемой?
Помогите, пожалуйста

Добавлено: 06 сен 2005, 14:38
Eugie
Sera, ты же просила поделиться идеями :) Фильтровать сообщения все-таки не просто правильно, но и необходимо: представь, если будет перенаправлен мессадж, который в другом контроле делает что-то полезное, а tooltip просто убивает :(

По сабжу: попробуй вставить m_tip.Activate(TRUE) перед RelayEvent. Если не поможет, посмотри, доходят ли оповещения TTN_SHOW и TTN_POP до твоего окна (через WM_NOTIFY).

Добавлено: 08 сен 2005, 11:52
Sera
Eugie, Спасибо за помощь. Фильтровка сообщений для tooltip-а добавлена. Хотя tooltip RelayEvent не съедает сообщения. Использует он их или нет -- все равно сообщения передаются дальше. А вот лишние разы слать TTM_RELAYEVENT неэффективно.

По сабжу: В первый раз TTN_SHOW и TTN_POP доходят. А потом нет.

Я тут попробовала сделать простенькое mfc dialog-based приложеньице.
Добавляю
CToolTipCtrl m_tip;

PretranslateMessage { m_tip.RelayEvent + фильтр :) }
OnInitDialog()
{
m_tip.Create(m_hWnd);
m_tip.AddTool(
//GetDlgItem(IDOK), //в этом случае все работает супер
m_hWnd, /*а так tooltip появляется и отрабатывает один раз. В следующий раз может появиться, если провести мышу над другим DlgItem-ом диалога. А если выводить за границу окна и возвращаться, то не появляется :( */
_T("Hi, Tooltip!!!"));
m_tip.Activate(TRUE);
}

Добавлено: 08 сен 2005, 13:44
Eugie
Ты пробовала вставлять вызов m_tip.Activate(TRUE) в PretranslateMessage? Есть подозрение, что tooltip рабочий, но по какой-то причине деактивируется после первого появления над твоим окном.

Добавлено: 08 сен 2005, 16:41
Sera
Нет, не помогает.
Горе мне, горе :) )) Короче, это микрософтовский глюк...