Алекс Jenter - Программирование на Visual C++. Архив рассылки
- Название:Программирование на Visual C++. Архив рассылки
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алекс Jenter - Программирование на Visual C++. Архив рассылки краткое содержание
РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.
Программирование на Visual C++. Архив рассылки - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Контрол | Соответствующий класс |
---|---|
Статический текст или изображение (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. Этот макрос объявлен так.
#define DECLARE_WND_SUPERCLASS(WndClassName, OrigWndClassName) \
static CWndClassInfo& GetWndClassInfo() \
{ \
static CWndClassInfo wc = \
{ \
{ sizeof(WNDCLASSEX), 0, StartWindowProc, \
0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \
OrigWndClassName, NULL, NULL, TRUE, 0, _T("") \
}; \
return wc; \
}
Параметр WndClassNameопределяет имя класса вашего нового контрола. В качестве второго параметра OrigWndClassNameследует указать имя класса контрола, который вы взяли за основу. При регистрации вашего класса WndClassNameWTL скопирует для него параметры из класса с именем OrigWndClassName, а также сохранит адрес оконной процедуры, связанной с этим классом, в переменной CWindowImplBaseT<>::m_pfnSuperWindowProcи будет обращаться к ней для обработки сообщений, которые не были обработаны через карту сообщений.
С учётом всего сказанного, типичный класс контрола выглядит так.
class CMyCoolControl : public CWindowImpl {
public:
DECLARE_WND_SUPERCLASS(NULL, CEdit::GetWndClassName())
BEGIN_MSG_MAP(CMyCoolControl)
// Карта сообщений
END_MSG_MAP()
…
};
В этом примере новый контрол создаётся на базе поля ввода (которому соответствует класс CEdit). Аналогично используется любой другой контрол.
ПРИМЕЧАНИЕ
Мы уже изучили макрос DDX_CONTROL, входящий в набор макросов DDX. Именно его следует использовать, чтобы связать существующий стандартный контрол (например, нарисованный в редакторе ресурсов) с объектом класса и наделить его дополнительными возможностями.
В библиотеку WTL входит несколько "самодельных" контролов, которые реализованы в файле atlctrlx.h . Вы можете вставлять их в свои программы или использовать как демонстрационные примеры по разработке контролов. Вот список классов, которые написали для вас разработчики WTL.
• CBitmapButton. Кнопка с рисунками.
• CCheckListViewCtrl. Расширенный список с "галочками".
• CHyperLink. Гиперссылка.
• CMultiPaneStatusBarCtrlImpl. Строка состояния с набором панелей.
• CWaitCursor. Курсор типа "песочные часы". Этот класс, в отличие от всех предыдущих, не имеет отношения к контролам.
Поскольку никакой официальной документации на эти классы нет, я приведу их краткое описание. Кроме этого, разобраться с ними вам поможет пример WTLCtlxDemo далее в этой статье.
Читать дальшеИнтервал:
Закладка: