Я создаю окно ToolTip и добавляю в него инструменты, используя флаги
TTF_IDISHWND | TTF_SUBCLASS. (c ++, win32)
У меня есть файл манифеста, так что моя программа использует новые темы WindowsXP
(comctrl32 версия 6).
При наведении курсора на зарегистрированный инструмент появляется подсказка.
Хорошо.
Когда я щелкаю мышью, подсказка исчезает.
Хорошо.
Однако отходя от инструмента и обратно
снова не заставляет чаевые вновь появляться. Мне нужно навести курсор на другой инструмент
а затем вернитесь к моему инструменту, чтобы получить подсказку, чтобы вернуться.
Когда я удаляю свой файл манифеста (чтобы использовать более старый не-XP comctrl32),
проблема уходит.
Проведя некоторые эксперименты, я обнаружил следующие различия
между всплывающими подсказками в Comctl32 версии 5 (старая) и Comctl32 версии 6 (новая):
Новые подсказки TTF_TRANSPARENT (при использовании на месте) фактически возвращаются
HTCLIENT из WM_NCITTEST, если кнопка мыши нажата, таким образом получая
WM_LBUTTONDOWN и украсть фокус на мгновение, прежде чем исчезнуть. Это вызывает
границы приложения для прошивки.
Старые подсказки TTF_TRANSPARENT всегда возвращают HTTRANSPARENT из WM_NCHITTEST,
и, таким образом, никогда не получайте WM_LBUTTONDOWN сами и никогда не крадите фокус. (Это выглядит просто эстетично, но может повлиять на следующий момент ...)
Новые всплывающие подсказки, похоже, не получают события WM_TIMER после щелчка мышью, и
возобновлять получение (кучу) событий таймера только после деактивации и
реактивировать. Таким образом, они не отображают окно подсказки после мыши
нажмите и отпустите.
Старые всплывающие подсказки получают сообщение WM_TIMER, как только мышь снова перемещается
после щелчка / отпускания, поэтому они готовы повторно отобразить свой совет.
Таким образом, в качестве обходного пути для comctl32 мне пришлось:
создает подкласс окна TOOLTIPS_CLASS и всегда возвращает HTTRANSPARENT из
WM_NCHITTEST, если инструмент запрашивал прозрачность.
избегайте использования TTF_SUBCLASS, а обрабатывайте сообщения мыши самостоятельно,
Я мог деактивировать / повторно активировать после получения WM_xBUTTONUP.
Я предполагаю, что изменение во внутреннем поведении состояло в том, чтобы приспособиться к новым "активируемым" функциям в подсказках, таким как гиперссылки, но поведение при наведении, таким образом, нарушено.
Кто-нибудь знает лучшее решение, чем мой обходной путь подкласса? Я что-то упустил?