Исчерпывающее руководство по написанию всплывающих подсказок - [7]

Шрифт
Интервал

 Параметр wParam этого сообщения содержит новое значение цвета текста, и устанавливается равным цвету круга (еще одна новая возможность IE 4.0 Common Controls DLL). Если курсор не попадает ни в один круг, поле szText указывает на пустую строку.

Функция CDTDemoView::PreTranslateMessage ретранслирует некоторые сообщения мыши элементу DataTip с помощью функции CToolTipCtrl::RelayEvent. CDTDemoView::PreTranslateMessage вызывается для каждого сообщения, посылаемого окну. Проще всего вызывать CToolTipCtrl::RelayEvent здесь, потому что в этом случае мне не нужно переопределять перехватчики каждого сообщения мыши для передачи этих сообщений элементу DataTip. Подобным же образом работает и поддержка подсказок классом CWnd.

Функция CDTDemoView::OnMouseMove прячет и показывает подсказку в зависимости от принадлежности координат курсора какому-нибудь кругу, что определяется функцией HitTest. Если курсор мыши не находится над кругом либо если он находится не над тем кругом, над которым он находился во время последнего показа подсказки, то CDTDemoView::OnMouseMove прячет подсказку вызовом m_ToolTip.Activate(FALSE). Значение FALSE показывает, что элемент DataTip должен быть спрятан. Далее, если курсор находится над другим кругом, подсказка снова выводится на экран вызовом m_ToolTip.Activate(TRUE), а в переменную CDTDemoView::m_pCircleHit заносится указатель на новый круг. Таким образом, при перемещении курсора с одного круга на другой, я выключаю подсказку и сразу включаю ее. Это делается для того, чтобы элемент DataTip запросил новый текст подсказки через сообщение TTN_NEEDTEXT, что позволяет инициализировать подсказку новой информацией о круге. В IE 4.0 для скрытия подсказки предназначено сообщение TTM_POP, но это сообщение отсутствовало в той версии файла commctrl.h, которая у меня была.

Подсказки домашнего изготовления: TitleTips

Демонстрационный проект TTDemo

Демонстрационный проект TTDemoDelay

TitleTip – это вид подсказок, которые позволяют полностью увидеть не полностью показанные строки в списковых элементах управления. Например, такие подсказки присутствуют в окне Project Workspace среды разработки Visual C++. Если имя класса не помещается в окно Project Workspace, появляется подсказка, которая показывает нужный текст целиком. Это избавляет пользователя от необходимости горизонтальной прокрутки и увеличении ширины окна. Я написал демо-проект, реализующий TitleTips для элемента управления "список". Однако вы можете использовать сходные приемы для добавления этого вида подсказок и к другим элементам управления. Код, который я написал, может работать как с обычными элементами "список", так и со списками с пользовательской отрисовкой (owner-draw listboxes). Я заполнил оба списка названиями моих любимых книг по программированию (см. рис.9).

Рис.9. Демонстрация элементов TitleTip

Вы, наверное, поинтересуетесь, почему я не использовал возможность пользовательской отрисовки подсказок (появившейся в IE 4.0 Common Controls DLL) для реализации TitleTips. Дело в том, что ширина окна подсказки рассчитывается исходя из ширины показанной части строки в списке. Другими словами, у вас нет прямого контроля над шириной элемента ToolTip. Это мешает реализации подсказок для элементов "список" с пользовательской отрисовкой, потому что вам может понадобиться вывести на экран не только текст. Кроме того, я думаю, нужно уметь создавать подсказки с нуля, потому что всегда может оказаться, что стандартная реализация подсказок не обеспечивает нужной функциональности. Допустим, вы захотите создать анимированную или говорящую подсказку.

На рис.10 показана диаграмма классов, которая показывает отношения между классами нашего примера. Класс CListBox – это стандартный класс MFC, который инкапсулирует функциональность стандартного элемента управления "список". Класс CTitleTipListBox унаследован от класса CListBox и ответственен за создание и управление подсказками для списка. CTitleTipListBox может использоваться напрямую, если вы реализуете обычный элемент "список". Класс CTitleTip унаследован от CWnd и представляет элемент ToolTip. Класс CODListBox – это элемент "список" с пользовательской отрисовкой, он унаследован от CTitleTipListBox. Для создания элемента "список" с пользовательской отрисовкой нужно унаследовать класс от CTitleTipListBox и переопределить функцию CTitleTipListBox::GetIdealItemRect. Мы обсудим детали реализации CTitleTipListBox::GetIdealItemRect позже.


Рис.10. Диаграмма классов для примера использования элементов ToolTip

Класс CTitleTip представляет окно подсказки (см. рис.11). В статической переменной CTitleTip::m_pszWndClass хранится зарегистрированное имя класса окна. Имя хранится в статической переменной, потому что класс окна нужно зарегистрировать только один раз для всех экземпляров CTitleTip. CTitleTip::m_nItemIndex – это индекс строки в списке, для которой в данный момент выводится подсказка. Эта переменная может принимать значение константы CTitleTip::m_nNoIndex, если подсказка не выводится ни для одной из строк. CTitleTip::m_pListBox хранит указатель на родительское окно элемента TitleTip. Родительское окно должно быть элементом "список", чтобы я смог взять оттуда информацию для подсказки.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.