LibKing » Книги » comp-programming » Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок

Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок

Тут можно читать онлайн Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок - бесплатно полную версию книги (целиком). Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте LibKing.Ru (ЛибКинг) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
libking
  • Название:
    Исчерпывающее руководство по написанию всплывающих подсказок
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Ваша оценка:

Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок краткое содержание

Исчерпывающее руководство по написанию всплывающих подсказок - описание и краткое содержание, автор Роджер Джек, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Исчерпывающее руководство по написанию всплывающих подсказок - читать онлайн бесплатно полную версию (весь текст целиком)

Исчерпывающее руководство по написанию всплывающих подсказок - читать книгу онлайн бесплатно, автор Роджер Джек
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

Реализации CDTDemoView::OnDraw и CDTDemoView::HitTest довольно прозрачны. CDTDemoView::OnDraw проходит по массиву кругов, вызывая для каждого круга CCircle::Draw. Функция CDTDemoView::HitTest проверяет, находится ли переданная ему точка над каким-нибудь кругом, вызывая для каждого круга в массиве CCircle::HitTest. Обратите внимание, что эта проверка выполняется в порядке, обратном используемому в CDTDemoView::OnDraw. Это делается для учитывания z-сортировки (z-order) кругов. Например, если круг Б нарисован поверх круга A, тогда сначала должна вызваться функция проверки круга Б.

Функция CDTDemoView::OnToolTipNeedText перехватывает нотификационные сообщения TTN_NEEDTEXT от элемента, на который указывает переменная m_ToolTip. Главное предназначение этой функции – определить, над каким кругом находится курсор и определить текст подсказки. Сначала она получает координаты курсора мыши и конвертирует их в клиентскую систему координат. Затем идет проверка на принадлежность координат клиентской части представления. Если этого не сделать, пропадут подсказки на панели инструментов, так как нотификационное сообщение TTN_NEEDTEXT используется также панелью инструментов. CDTDemoView::OnToolTipNeedText автоматически будет получать все сообщения TTN_NEEDTEXT при активном окне представления. Переменная bHandledNotify показывает, должно ли сообщение передаваться дальше главному окну. Если курсор находится в клиентской части окна, я проверяю его координаты на принадлежность какому-нибудь кругу и сохраняю результаты проверки в переменной m_pCircleHit. Эта переменная также используется в функции CDTDemoView::OnMouseMove. Если курсор попадает в один из кругов, я создаю строку подсказки, в которую заношу координаты центра, радиус и цвет круга. Эта строка копируется в поле szText переданной структуры TOOLTIPTEXT. И, наконец, я устанавливаю цвет текста подсказки с помощью сообщения TTM_SETTIPTEXTCOLOR. [5] что эквивалентно CToolTipCtrl::SetTipTextColor – прим.пер. Параметр 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. Родительское окно должно быть элементом "список", чтобы я смог взять оттуда информацию для подсказки.

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


Роджер Джек читать все книги автора по порядку

Роджер Джек - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Исчерпывающее руководство по написанию всплывающих подсказок, автор: Роджер Джек. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на PGEgaHJlZj0ibWFpbHRvOmFidXNlQGxpYmtpbmcucnUiIHJlbD0ibm9mb2xsb3ciPmFidXNlQGxpYmtpbmcucnU8L2E+ или заполните форму обратной связи.
img img img img img