Я создаю окно Подсказка и добавляю в него инструменты с помощью флагов TTF_IDISHWND | TTF_SUBCLASS. (C++, win32)
У меня есть файл манифеста, в котором моя программа использует новые темы WindowsXP. (comctrl32 версии 6).
При наведении курсора на зарегистрированный инструмент появляется подсказка.
Хорошо.
Когда я щелкаю мышью, кончик исчезает.
Ок.
Однако отход от инструмента и обратно
снова не заставляет кончик снова появляться. Мне нужно навести курсор на другой инструмент
а затем возвращаюсь к моему инструменту, чтобы вернуть чаевые.
Когда я удаляю свой файл манифеста (чтобы использовать более старую версию comctrl32, отличную от XP), проблема уходит.
Поэкспериментировав, я обнаружил следующие отличия между подсказками в 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.
Я предполагаю, что изменение внутреннего поведения было связано с добавлением новых «интерактивных» функций во всплывающих подсказках, таких как гиперссылки, но поведение при наведении указателя кажется таким образом нарушенным.
Кто-нибудь знает лучшее решение, чем обходной путь моего подкласса? Я упускаю какой-то другой момент?
Я не знаю, но это звучит как действительно «сложная» проблема (в том смысле, что все реальные) проблемы действительно сложны. Бьюсь об заклад, основная проблема связана с настройкой фокуса. Windows, которая делает это вручную, является злом и обычно страдает от всевозможных ошибок.
Вы не единственный, кто столкнулся с проблемами совместимости с подсказками между этими DLLS.
У меня тоже был ничего, кроме неприятностей с новыми всплывающими подсказками в тематических общих элементах управления. Мы уже обезглавливали сообщения мыши и активировали / деактивировали подсказки перед добавлением манифеста и темами нашего приложения - так что похоже, что то, что вы делаете, не слишком безумно.
Мы все еще живем с проблемами, связанными с постоянной отправкой сообщений TTN_NEEDTEXT при движении мыши (а не только при наведении курсора), проблемами позиционирования с большими подсказками (возможно, не чем-то новым) и отправкой нечетных сообщений Unicode вместо версий ANSI (что я планирую опубликовать как вопрос в какой-то момент).
@AlwaysLearningNewStuff, я посмотрел вопрос. Прошло слишком много времени с тех пор, как я сделал win32, чтобы я мог помочь с чем-то настолько конкретным, извините.
У меня аналогичная проблема с управлением
tooltip
. Моя проблема кажется простой, но никто не предложил ее решения. Я предложил награду, но получил один ответ, который мне не помог. Я прошу вас взглянуть на мой вопрос и сказать мне, сталкивались ли вы когда-нибудь с такой проблемой и решали ее. Прошу прощения за то, что беспокою вас так, обычно я не прошу помощи таким образом, но я в отчаянии. Спасибо. С наилучшими пожеланиями.