Поддержка подсказок MFC-классами
Поддержка подсказок MFC-классами
Библиотека MFC располагает двумя классами для поддержки всплывающих подсказок: CToolTipCtrl и CWnd. CToolTipCtrl инкапсулирует функциональность стандартного элемента управления ToolTip (из библиотеки элементов управления общего назначения – Common Controls DLL) и может, таким образом, использоваться для создания и управления элементом подсказки напрямую. Один элемент ToolTip может поддерживать много инструментов (tools), которые представляют собой прямоугольники в окне, и могут быть (а могут и не быть) дочерними окнами. Один инструмент также может заполнять все окно. Информация об инструменте в некоторых случаях передается в структуре TOOLINFO со следующими полями: хэндл окна, содержащего инструмент, ID или хэндл окна самого инструмента, координаты инструмента (прямоугольник), и информация о тексте для этого инструмента. Один из самых важных методов – это CToolTipCtrl::RelayEvent, который используется для ретрансляции (relay) сообщений мыши элементу ToolTip для обработки. Передача сообщений мыши элементу необходима для того, чтобы ToolTip смог определить момент, когда следует показать или скрыть подсказку. К сожалению, CToolTipCtrl не полностью инкапсулирует функциональность элемента ToolTip. К примеру, CToolTipCtrl::SetDelayTime не поддерживает все допустимые интервалы задержки. Иногда мне приходилось напрямую использовать сообщения и уведомления Windows® из-за подобных ограничений.[1] Имена всех сообщений (messages) элемента ToolTip начинаются с префикса "TTM_", а имена всех уведомлений (notifications) – с префикса "TTN_". Далее я буду много использовать этот класс, поэтому пока что не стану заострять на нем внимание.
Не так давно Microsoft расширила DLL, содержащую элемент ToolTip (comctl32.dll), с выпуском Microsoft® Internet Explorer 4.0 (IE 4.0). Статья в MSJ из двух частей – "Предварительный обзор библиотеки элементов управления общего назначения для Microsoft Internet Explorer" (первая часть которой была опубликована в октябре 1996 года) – прекрасно описывает новые возможности библиотеки. В эти возможности входят пользовательская отрисовка подсказок (owner-draw), многострочные подсказки, подсказки произвольного цвета, а также поддержка подсказок, перемещающихся за мышью. Появилось сообщение TTM_GETDELAYTIME для получения различных значений интервалов задержки и сообщение TTM_POP для скрытия элемента ToolTip. Увы, на тот момент, когда я пишу эти строки, Microsoft еще не добавила поддержку новых возможностей в CToolTipCtrl. Поэтому для примеров в этой статье я вынужден использовать CWnd::SendMessage. (В выходящем скоро Visual Studio файл commctl.h должен содержать все необходимые объявления – ред.)
Класс CWnd представляет базовую поддержку добавления подсказок к окну. Рисунок 1 показывает методы CWnd для поддержки подсказок. CWnd::EnableToolTips разрешает или запрещает подсказки для окна, и должна быть вызвана до вызова других методов. Нужно заметить, что в работе CWnd::EnableToolTips есть недостаток: когда вы передаете CWnd::EnableToolTips значение FALSE, этот метод вызывает еще один метод, который посылает сообщение для деактивации элемента ToolTip. Когда же вы вызываете CWnd::EnableToolTip со значением TRUE, он не активирует ToolTip заново.
Рис.1. Поддержка подсказок классом CWnd
Метод Описание BOOL EnableToolTips(BOOL bEnable) Разрешает или запрещает подсказки для окна virtual int CWnd::OnToolHitTest(CPoint point, TOOLINFO* pTI ) const Вызывается библиотекой, чтобы определить, не находится ли курсор мыши над инструментом, имеющим подсказку void FilterToolTipMessage(MSG* pMsg) Проверяет, относится ли сообщение к выводу подсказок static void PASCAL CancelToolTips(BOOL bKeys) Прячет подсказку, если она показана на экранеCWnd::OnToolHitTest вызывается непосредственно библиотекой, и вы можете переопределить эту функцию для реализации собственного алгоритма определения контура инструмента. Первый аргумент, point, является координатами курсора в клиентских координатах. Используйте его для сравнения позиции курсора с координатами ваших инструментов (или кнопок). Второй параметр – это уже упоминавшаяся структура TOOLINFO. Далее я покажу, как переопределять функцию CWnd::OnToolHitTest.
CWnd::FilterToolTipMessage обычно вызывается за вас функцией CWnd::PreTranslateMessage. Вы можете вызвать CWnd::FilterToolTipMessage напрямую (обычно из переопределенной PreTranslateMessage), если CWnd::PreTranslateMessage у вас не вызывается. Позже я покажу, как это делается. CWnd::CancelToolTips прячет показанный элемент ToolTip. Параметр bKeys устанавливается в TRUE, чтобы прятать подсказку по нажатию клавиши. Важно осознавать, что, несмотря на статичность функции-члена CWnd::CancelToolTips, она воздействует только на элементы ToolTip, созданные классом CWnd. Другими словами, она не влияет на объекты CToolTipCtrl, которые вы создаете в собственном коде.
На самом деле CWnd реализует подсказки скрытым созданием и манипулированием объектом CToolTipCtrl. CWnd сохраняет указатель на элемент ToolTip в поле m_pToolTip скрытой структуры AFX_THREAD_STATE. Эта структура используется библиотекой MFC для хранения локальной информации потока. CWnd не предоставляет документированного прямого доступа к этому элементу.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Формирование поисковых подсказок
Формирование поисковых подсказок Поисковые подсказки в «Яндексе» возникают в раскрывающемся списке при начале ввода запроса в строку поиска. В перечне до десяти строк все фразы начинаются с тех букв, которые пользователь успел написать, но заканчиваются по — разному.
5.2. Отношения между классами
5.2. Отношения между классами Кроме внутреннего устройства или структуры классов на соответствующей диаграмме указываются различные отношения между классами. При этом совокупность типов таких отношений фиксирована в языке UML и предопределена семантикой этих типов
Отключение подсказок для кнопок Свернуть, Развернуть и Закрыть
Отключение подсказок для кнопок Свернуть, Развернуть и Закрыть В Windows 2000/XP контекстная подсказка отображается при размещении курсора мыши поверх кнопок Свернуть, Развернуть и Закрыть. Чтобы отключить эти подсказки, откройте раздел HKCUControl PanelDesktopи замените первую цифру
Поддержка SMP
Поддержка SMP Несмотря на то что классическая архитектура сервера полностью использует возможности SMP-систем, она имеет ряд недостатков, которые накладывают слишком высокие требования на ресурсы сервера в случае очень большого количества соединений с базой данных. Как
Отображение пользовательских экранных подсказок для кнопок на панели инструментов
Отображение пользовательских экранных подсказок для кнопок на панели инструментов Экранные подсказки- это те небольшие сообщения желтого цвета, которые появляются на экране после подведения указателя мыши к определенному элементу на одну-две секунды.Экранные
3.4. Отношения между классами
3.4. Отношения между классами Типы отношений Рассмотрим сходства и различия между следующими классами: цветы, маргаритки, красные розы, желтые розы, лепестки и божьи коровки. Мы можем заметить следующее: • Маргаритка - цветок. • Роза - (другой) цветок. • Красная и желтая
Отключение всплывающих подсказок в Проводнике и на Рабочем столе
Отключение всплывающих подсказок в Проводнике и на Рабочем столе Ключ:[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced]
Интерфейсы в сравнении с абстрактными базовыми классами
Интерфейсы в сравнении с абстрактными базовыми классами С учетом знаний, полученных в главе 4, вы можете спросить, какова причина выдвижения типов интерфейса на первое место. Ведь в C# позволяется строить абстрактные типы класса, содержащие абстрактные методы. И, подобно
Вывод подсказок для выбранных элементов меню
Вывод подсказок для выбранных элементов меню Наконец, нужно настроить первую панель так. чтобы она содержала текст подсказки для выбранного пользователем элемента меню. Вы знаете, что большинство приложений отображает в левой части строки состояния поясняющую
Соблюдение требований, предъявляемых другими классами, с помощью протоколов
Соблюдение требований, предъявляемых другими классами, с помощью протоколов В языке Objective-C существует концепция под названием «протокол». Протоколы встречаются и во многих других языках, но называются везде по-разному; например, в Java аналогичная сущность называется
Простая реализация подсказок с помощью MFC
Простая реализация подсказок с помощью MFC Microsoft упростила добавление подсказок к кнопкам на панелях инструментов. Если вы используете AppWizard, этот процесс происходит автоматически. При генерации вашего приложения с помощью AppWizard щелкните флажок "Docking toolbar". После генерации
Добавление подсказок к модальным диалоговым окнам
Добавление подсказок к модальным диалоговым окнам Вы, вероятно, видели диалоги с подсказками для каждого элемента управления на них. Это очень удобно, если предназначение элемента неочевидно из контекста. Статья Q141758 в базе знаний (Knowledge Base) подробно описывает, как
Добавление подсказок к Web-страницам
Добавление подсказок к Web-страницам Демонстрационный проект WebButtonКак и в приложениях, подсказки на Web-страницах могут быть очень полезны. Подсказки могут быть использованы в двух очевидных случаях: для картинок и элементов ActiveX. Я написал пример элемента "кнопка", чтобы
Что делать с отложенными классами?
Что делать с отложенными классами? Присутствие отложенных элементов в системе вызывает вопрос: "что случится, если компонент rotate применить к объекту типа FIGURE?" или в общем виде - "можно ли применить отложенный компонент к прямому экземпляру отложенного класса?" Ответ может