Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

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

• Гиперссылка выглядит, как в IE. Интересно, что цвета для ссылки (обычной и посещённой) берутся из настроек IE, хранящихся в реестре. Если настройки обнаружить не удаётся, используются цвета по умолчанию (синий и фиолетовый).

• При наведении на ссылку курсор приобретает форму руки. Обратите внимание, что под Windows 2000 класс CHyperLink использует системный курсор, а в других версиях Windows создаёт его на лету, избавляя вас от необходимости включать его в ресурсы во всех случаях. Кроме того, следует отметить, что курсор должен располагаться именно на надписи, а не в любой точке статического контрола, даже если вы нарисовали его очень большим.

• Если задержать курсор над ссылкой, появляется всплывающая подсказка с адресом, по которому будет осуществляться переход.

• Класс CHyperLink поддерживает не только мышиный, но и клавиатурный интерфейс. Ссылка, на которую установлен фокус ввода, выделяется

пунктирной рамкой. При этом можно перейти по ней, нажав Enter или Space.

ПРИМЕЧАНИЕ

В типичном модальном диалоге Enter не будет попадать в ссылку, так как диалог преобразует его в нажатие кнопки по умолчанию. При желании изменить это поведение можно, переопределив обработчик OnGetDlgCode класса CHyperLink.

Переход по ссылке реализован через функцию ShellExecute. Эта функция понимает как адреса сайтов (при этом открывается броузер), так и почтовые адреса (при этом запускается почтовый клиент).

Список методов класса CHyperLink приведён в таблице 8.

Метод Описание
CHyperLinkImpl Конструктор. Записывает в переменные объекта значения по умолчанию.
~CHyperLinkImpl Деструктор. Освобождает ресурсы, распределённые в процессе инициализации.
bool GetLabel(LPTSTR lpstrBuffer, int nLength) const Возвращает метку гиперссылки (то есть строку, которую пользователь видит на экране).
bool SetLabel(LPCTSTR lpstrLabel) Устанавливает метку гиперссылки. Текст сохраняется внутри объекта класса. Память для него распределяется динамически. По умолчанию в качестве метки используется содержимое статического контрола, который связывается с объектом класса. Поэтому часто удаётся обойтись и без метода SetLabel.
bool GetHyperLink(LPTSTR lpstrBuffer, int nLength) const Возвращает адрес гиперссылки, по которому осуществляется фактический переход.
bool SetHyperLink(LPCTSTR lpstrLink) Устанавливает адрес гиперссылки. Адрес также сохраняется внутри объекта класса в динамически распределяемой памяти. Иногда адрес совпадает с меткой. В этом случае устанавливать его вызовом SetHyperLink необязательно, так как класс CHyperLink сделает это за вас.
BOOL SubclassWindow(HWND hWnd) Подменяет оконную процедуру окна, подключая к нему объект класса.
bool Navigate Осуществляет переход по ссылке.
void Init Инициализирует объект класса: создаёт или загружает курсор в виде руки, создаёт подчёркнутый фонт и тултип для ссылки, загружает из реестра цвета, которые использует IE.
void DoPaint(CDCHandle dc) Рисует ссылку. Вы можете переопределить этот метод в производном классе, чтобы изменить её внешний вид.

ПРИМЕЧАНИЕ

Обратите внимание: если метка и адрес гиперссылки у вас отличаются, метод SetHyperLink следует вызывать до связывания объекта класса с контролом. Дело в том, что в момент связывания (в функции Init, которая вызывается из SubclassWindow) для ссылки создаётся тултип, в который записывается адрес ссылки. Если адрес ещё не задан, в тултип запишется метка.

Класс CMultiPaneStatusBarCtrlImpl

Класс CMultiPaneStatusBar призван облегчить вашу жизнь при работе со строками состояния. Стандартный контрол status bar из набора общих контролов Windows позволяет создать на строке состояния до 256 панелей, в которых можно отображать текст и иконки. Но он не предоставляет никаких средств для автоматического перемещения этих панелей. Программисту на чистом API приходится передвигать их вручную всякий раз, когда строка состояния изменяет свой размер. В MFC эту работу берёт на себя класс CStatusBar. А в WTL вам поможет класс CMultiPaneStatusBar.

Посмотрим, каким образом используется класс CMultiPaneStatusBar. Сначала объект класса связывается с существующей строкой состояния при помощи DDX_CONTROL. Можно и создать строку состояния с нуля, используя метод Create. Затем задаётся набор панелей для строки состояния. Для этого предназначен метод SetPanes. Он принимает количество панелей и массив с их идентификаторами. Идентификаторы используются для последующего обращения к панелям. Одной из панелей можно назначить стандартный идентификатор ID_DEFAULT_PANE. Панель с таким идентификатором растягивается, занимая всё свободное пространство в строке состояния. Остальные панели имеют фиксированный размер (который всегда можно изменить, используя метод SetPaneWidth). О корректном перемещении панелей заботится WTL. Вам остаётся только изменять текст панелей, их иконки и всплывающие подсказки в соответствии с вашими нуждами.

Полный список методов класса CMultiPaneStatusBar приведён в таблице 9.

Метод Описание
CMultiPaneStatusBarCtrlImpl Конструктор.
Не выполняет никакой полезной работы.
~CMultiPaneStatusBarCtrlImpl Деструктор. Освобождает память, занятую списком идентификаторов панелей.
HWND Create(HWND hWndParent, LPCTSTR lpstrText, DWORD dwStyle, UINT nID) HWND Create(HWND hWndParent, UINT nTextID, DWORD dwStyle, UINT nID) Создают строку состояния.
BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true) Задаёт набор панелей для строки состояния. При этом предыдущий набор полностью теряется. Массив pPanes содержит идентификаторы панелей. Начальный размер панели подгоняется под строку из ресурсов, идентификатор которой совпадает с идентификатором панели. Если задан флаг bSetText, текст из ресурсов будет сразу же вставлен в соответствующие панели.
bool GetPaneTextLength(int nPaneID, int* pcchLength = NULL, int* pnType = NULL) const Возвращает длину текста в панели nPaneID через указатель pcchLength. По адресу pnType записывается тип панели. В Windows определены следующие типы: SBT_NOBORDERS (панель не имеет видимой рамки), SBT_OWNERDRAW (панель отрисовывается родительским окном), SBT_POPOUT (панель выглядит выпуклой на строке состояния) и SBT_RTLREADING (изменяет направление текста на противоположное). Нулевой тип соответствует обычной панели, которая вдавлена в строку состояния.
BOOL GetPaneText(int nPaneID, LPTSTR lpstrText, int* pcchLength = NULL, int* pnType = NULL) const Аналогичен предыдущему, но извлекает также текст панели в буфер lpstrText.
BOOL SetPaneText(int nPaneID, LPCTSTR lpstrText, int nType = 0) Задаёт текст (параметр lpstrText) и тип (параметр nType) для панели nPaneID.
BOOL SetPaneWidth(int nPaneID, int cxWidth) Устанавливает ширину панели nPaneID равной cxWidth.
BOOL GetPaneTipText(int nPaneID, LPTSTR lpstrText, int nSize) const Извлекает текст всплывающей подсказки для панели nPaneID.
BOOL SetPaneTipText(int nPaneID, LPCTSTR lpstrText) Устанавливает текст всплывающей подсказки для панели nPaneID.
BOOL GetPaneIcon(int nPaneID, HICON& hIcon) const Извлекает хэндл иконки, назначенной панели nPaneID.
BOOL SetPaneIcon(int nPaneID, HICON hIcon) Задаёт иконку для панели nPaneID.
BOOL UpdatePanesLayout Пересчитывает расположение панелей. Вызывайте этот метод всякий раз, когда вы изменяете размеры панелей с помощью методов SetPanes и SetPaneWidth.
int GetPaneIndexFromID(int nPaneID) const Определяет индекс панели по её идентификатору. Как известно, стандартный status bar использует для работы с панелями индексы. Вам вряд ли потребуется этот метод, поскольку класс CMultiPaneStatusBar позволяет вам выполнять все необходимые операции по идентификатору панели. Но для полноты картины стоит упомянуть и его.

ПРИМЕЧАНИЕ

Методы GetPaneTipText, SetPaneTipText, GetPaneIcon и SetPaneIcon доступны, только если макрос _WIN32_IE имеет значение 0x0400 или выше.

И последний важный момент. Всякий раз, когда окно изменяет размер, вы должны посылать строке состояния сообщение WM_SIZE, чтобы она могла скорректировать своё местоположение и размер.

Класс CWaitCursor

Класс CWaitCursor – это простенькая обёртка вокруг метода SetCursor из Win32 API. При помощи этого класса вы можете временно изменить вид курсора мыши. Чаще всего класс CWaitCursor применяют, чтобы "выплюнуть" песочные часы на время выполнения длительной операции. Отсюда и название класса.

Полный список методов класса CWaitCursor приведён в таблице 8.

Метод Описание
CWaitCursor(bool bSet = true, LPCTSTR lpstrCursor = IDC_WAIT, bool bSys = true) Конструктор. Параметр lpstrCursor задаёт имя ресурса, из которого следует грузить курсор. Если вы собираетесь использовать системный курсор, параметр bSys устанавливается в true. Наконец, флаг bSet определяет, следует ли вызывать из конструктора метод Set (см. ниже).
~CWaitCursor Деструктор. Из него принудительно вызывается метод Restore (см. ниже).
bool Set Заменяет текущий курсор курсором, заданным в конструкторе.
bool Restore Восстанавливает старый курсор, который был изменён методом Set.
Поделиться:
Популярные книги

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Завод-3: назад в СССР

Гуров Валерий Александрович
3. Завод
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Завод-3: назад в СССР

Секретарь лорда Демона

Лунёва Мария
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Секретарь лорда Демона

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10

Я тебя не отпущу

Коваленко Марья Сергеевна
4. Оголенные чувства
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Я тебя не отпущу

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Девочка из прошлого

Тоцка Тала
3. Айдаровы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка из прошлого

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Жена проклятого некроманта

Рахманова Диана
Фантастика:
фэнтези
6.60
рейтинг книги
Жена проклятого некроманта

Имя нам Легион. Том 9

Дорничев Дмитрий
9. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 9