Поддержка cтандартных и общих контролов Windows
Мы с вами уже изучили класс CWindow, который предоставляет целый набор обёрток для функций Win32 API, предназначенных для работы с окнами. При работе с контролами этот класс также можно использовать. Но гораздо удобнее использовать специальные классы контролов, которые описаны в файле atlctrls.h . Полный список этих классов приведён в таблице 5.
Контрол |
Соответствующий класс |
Статический текст или изображение (static control) |
CStatic |
Кнопка (button) |
CButton |
Простой список (list box) |
CListBox |
Комбинированный список (combo box) |
CComboBox |
Поле ввода (edit box) |
CEdit |
Полоса прокрутки (scroll bar) |
CScrollBar |
Список изображений (image list) |
CImageList |
Расширенный список (list view) |
CListViewCtrl |
Дерево (tree view) |
CTreeViewCtrl, CTreeViewCtrlEx |
Заголовок (header) |
CHeaderCtrl |
Панель инструментов (toolbar) |
CToolBarCtrl |
Строка состояния (status bar) |
CStatusBarCtrl |
Окно с закладками (tab control) |
CTabCtrl |
Всплывающая подсказка (tooltip) |
CToolTipCtrl |
Ползунок (trackbar) |
CTrackBarCtrl |
Регулятор (up-down control) |
CUpDownCtrl |
Индикатор прогресса (progress bar) |
CProgressBarCtrl |
Горячая клавиша (hot key) |
CHotKeyCtrl |
Окно с анимацией (animate control) |
CAnimateCtrl |
Расширенное поле ввода (rich edit) |
CRichEditCtrl |
Список с возможностью перетаскивания (drag list box) |
CDragListBox |
Полоска-контейнер (rebar control) |
CReBarCtrl |
Комбинированный список с картинками (ComboBoxEx control) |
CComboBoxEx |
Выбор даты/времени (date and time picker) |
CDateTimePickerCtrl |
Календарь на меcяц (month calendar) |
CMonthCalendarCtrl |
"Плоская" полоса прокрутки (flat scroll bar) |
CFlatScrollBar |
IP-адрес (IP address control) |
CIPAddressCtrl |
Пейджер (pager control) |
CPagerCtrl |
Каждый из этих классов порождён от CWindowи содержит все его методы. В дополнение каждый класс предоставляет:
• Метод GetWndClassName. Этот метод позволяет узнать имя класса окна, соответствующего данному контролу.
• Метод Create. В отличие от аналогичного метода из класса CWindow, он не принимает имя класса, так как оно извлекается при помощи GetWndClassName.
• Обёртки для стандартных сообщений, которые используются для управления контролом. Например, для статических контролов это сообщения STM_GETICON, STM_GETIMAGE, STM_SETICONи STM_SETIMAGE. Используя обёртки, вы можете не вспоминать, каким образом упаковываются в wParamи lParamпараметры этих сообщений.
• Обёртки для функций Win32 API, манипулирующих контролом. Такие функции существуют лишь для нескольких контролов (таких, как scroll bar).
Обратите внимание, что функциональность всех классов из atlctrls.h регулируется макросами WINVER, _WIN32_IEи _RICHEDIT_VER. Например, функции, специфичные для контролов из internet Explorer 4.0 и выше, оформлены так:
#if (_WIN32_IE >= 0x0400)
...
#endif //(_WIN32_IE>= 0x0400)
Благодаря этому классы контролов из WTL можно использовать при работе с любой версией контролов, получая при этом доступ ко всему набору возможностей используемой версии.
Полное описание всех функций и классов из atlctrls.h выходит за рамки данной статьи.
"Самодельные" контролы
Если бы все программы использовали только стандартные контролы, они были бы скучными и неудобными. Поэтому разработчикам часто приходится "изобретать" свои собственные контролы. При этом можно разрабатывать новый контрол "с нуля" или взять за основу уже существующий контрол.
Создавать контролы "с нуля" мы уже умеем. Для этого нужно породить новый класс от CWindowImpl<>и написать обработчики нужных сообщений. Чаще других обрабатываются сообщения WM_CREATEи WM_PAINT, а также клавиатурные и мышиные сообщения. Кроме того, нужно предусмотреть средства для взаимодействия программы с вашим контролом. Для этой цели можно ввести нестандартные сообщения, которые будет понимать ваш контрол, или предусмотреть соответствующие методы в вашем классе.
Если вы решили построить свой контрол на базе существующего, вам также следует использовать класс CWindowImpl<>. Нужно только учесть два момента. Во-первых, базовым классом для вашего контрола должен быть не CWindow, а класс контрола, который вы модифицируете. Базовый класс задаётся во втором параметре шаблона CWindowImpl<>(по умолчанию этот параметр равен CWindow). А во-вторых, для обработки сообщений по умолчанию должна использоваться не функция DefWindowProc(как для обычных окон), а оконная функция соответствующего контрола. Чтобы этого добиться, следует использовать макрос DECLARE_WND_SUPERCLASSвместо DECLARE_WND_CLASS. Этот макрос объявлен так.
Читать дальше