PDA

Просмотр полной версии : ToolTip control срабатывает только 1 раз



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

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

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

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

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

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

Sera
01.09.2005, 12:02
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);
//...
}

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

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

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

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


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

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

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

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

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

Sera
08.09.2005, 11:52
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);
}

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

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

Kolinus
08.09.2005, 18:11
а подробнее можно ??
с чего уверенность что это глюк ??
где-то есть его описание ?

_serg_
31.05.2007, 11:34
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=591982&SiteID=1
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=279299&SiteID=1
https://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=703382&SiteID=1
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=190224&SiteID=1
http://rsdn.ru/article/dotnet/WinForms20.xml#EYF