Подсказка Win32 исчезает, чтобы никогда не появиться снова с Commctl 6

Я создаю окно Подсказка и добавляю в него инструменты с помощью флагов 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.

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
1 930
2

Ответы 2

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

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

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

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

У меня аналогичная проблема с управлением tooltip. Моя проблема кажется простой, но никто не предложил ее решения. Я предложил награду, но получил один ответ, который мне не помог. Я прошу вас взглянуть на мой вопрос и сказать мне, сталкивались ли вы когда-нибудь с такой проблемой и решали ее. Прошу прощения за то, что беспокою вас так, обычно я не прошу помощи таким образом, но я в отчаянии. Спасибо. С наилучшими пожеланиями.

AlwaysLearningNewStuff 30.01.2014 01:32

@AlwaysLearningNewStuff, я посмотрел вопрос. Прошло слишком много времени с тех пор, как я сделал win32, чтобы я мог помочь с чем-то настолько конкретным, извините.

Aardvark 30.01.2014 20:36

Другие вопросы по теме