Win32 ToolTip исчезает, чтобы никогда не появиться снова с Commctl 6 - PullRequest
8 голосов
/ 09 сентября 2008

Я создаю окно 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.

Я предполагаю, что изменение во внутреннем поведении состояло в том, чтобы приспособиться к новым "активируемым" функциям в подсказках, таким как гиперссылки, но поведение при наведении, таким образом, нарушено.

Кто-нибудь знает лучшее решение, чем мой обходной путь подкласса? Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 09 сентября 2008

Вы не единственный, кто столкнулся с проблемами совместимости между всплывающими подсказками между этими DLLS.

У меня тоже было ничего, кроме неприятностей с новыми подсказками в общих элементах управления. Мы уже манипулировали сообщениями мыши и активными / деактивирующими подсказками перед добавлением манифеста и тематикой нашего приложения - так что, похоже, ваши действия не слишком сумасшедшие.

Мы по-прежнему сталкиваемся с проблемами с сообщениями TTN_NEEDTEXT, которые постоянно отправляются при перемещении мыши (не только при наведении курсора), с проблемами позиционирования с большими подсказками (возможно, не с чем-то новым) и с отправкой нечетных сообщений в юникоде вместо версий ANSI (который я планирую опубликовать как вопрос в какой-то момент).

0 голосов
/ 09 сентября 2008

Я не знаю, но это звучит как действительно "трудная" проблема (в том смысле, что все реальные) проблемы действительно тяжелые. Могу поспорить, что основная проблема связана с настройкой фокуса. Windows, которые делают это вручную, являются злыми и обычно страдают от всевозможных ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...