Замечания по Win API: Toolbar и tooltips-ы на нем

Отречение: имена функции, наименования классов и стилей пишу по памяти.

Речь идет о тулбаре, сделанном «своими руками», с использованием стандартного Windows-контрола ToolbarClass32.

В MSDN говорится, что для того, чтобы на кнопках на тулбаре появились тултипсы, достаточно при создании тулбара в CreateWindowEx добавить стиль TBSTYLE_TOOLTIPS.

Что происходит в этом случае? Вместе с тулбаром Windows автоматом создает контрол TooltipsClass32. При наведении на кнопку, находящуюся на тулбаре, контрол тултипа посылает событие TTM_GETDISPTEXT в форме WM_NOTIFY родительскому окну тулбара (не самому тулбару, а его родителю, а в случае, если тулбар лежит на ребаре, то событие посылается родительскому окно ребара). Обрабатывая сообщение TTM_GETDISPTEXT (или, что тоже TTM_NEEDTEXT), нужно заполнить структуру, содержащую текст тултипа.
В MSDN приведены примеры и подробное описание того, как все это можно реализовать.

Но… это не работает. Вернее, не всегда работает.

Я использую Spy++ для мониторинга сообщений Windows. Не самый последний Spy, но мне его всегда хватало. Так вот, почему то, этот Spy не всегда ловит сообщения TTM_GETDISPTEXT. Подозреваю, что возможно дело в Clarion или тулбаре, так как это сообщение отслеживается, например, в проводнике Windows, или на Кларином entry-поле. Собственно поэтому, создается впечатление, что событие TTM_GETDISPTEXT не приходит в процедуру окна.

Следующий момент состоит в том, что сообщений TTM_GETDISPTEXT на самом деле два вида: TTM_GETDISPTEXTA и TTM_GETDISPTEXTW. Сообщение TTM_GETDISPTEXTW должно приходить в том случае, если контрол создан в Unicode-формате. Так как при создании тулбара указывается стиль TBSTYLE_TOOLTIPS, то мы не можем сами влиять на то, каким будет создан тултип контрол. Он ведь создается Windows в автомате. Таким образом, у меня в Windows XP SP 2, тултип создался как Unicode-тултип. Этого я совсем не ожидал и, соответственно, ловил сообщение TTM_GETDISPTEXTA. И опять создается впечатление, что это событие не происходит.

Выводы:

1. Spy ++ не всегда показывает все события

2. При обработке событий, которые могут иметь два формата ANSII и Unicode, возможно есть необходимость обрабатывать оба этих события, в том случае, если вы не знаете наверняка в каком формате создан контрол.