Элементы управления ActiveX в MFC. Создание подкласса элемента управления Windows
Этот раздел описывает процесс для создание подкласса для общего элемента управления Windows для создания элемента управления ActiveX. Создание подкласса для существующего элемента управления Windows быстрый способ разработки элементов управления ActiveX. Новый элемент управления будет иметь возможности является подклассом управления Windows, например рисование и реагировать на щелчкам мышью. Пример кнопка элементов управления ActiveX MFC пример создание подкласса для элемента управления Windows.
К вложенному классу элемента управления Windows, выполняет следующие задачи:
Переопределите IsSubclassedControl функции-члены и PreCreateWindow COleControl
Измените функцию-член OnDraw
Обработка всех сообщений элемента управления ActiveX () OCM отраженные в элемент управления
Примечание
Многие из этого рабочего выполняется автоматически с помощью мастера элементов управления ActiveX при размещении элемента управления для является подклассом с помощью раскрывающегося списка Выделите класс родительского окна на странице Параметры элементов управления.
См. статью базы знаний Q243454 дополнительные сведения на создание подкласса для элемента управления.
Переопределение IsSubclassedControl и PreCreateWindow
Для переопределения PreCreateWindow и IsSubclassedControl, добавьте следующие строки кода в раздел protected объявления класса элемента управления.
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();
В файле реализации элемента управления (CPP), добавьте следующие строки кода для реализации 2 переопределенных функции:
// CMyAxSubCtrl::PreCreateWindow - Modify parameters for CreateWindowEx
BOOL CMyAxSubCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
cs.lpszClass = _T("BUTTON");
return COleControl::PreCreateWindow(cs);
}
// CMyAxSubCtrl::IsSubclassedControl - This is a subclassed control
BOOL CMyAxSubCtrl::IsSubclassedControl()
{
return TRUE;
}
Обратите внимание, что в этом примере, элемент управления "кнопка" Windows задается в PreCreateWindow. Однако все стандартные элементы управления Windows можно является подклассом. Дополнительные сведения о стандартных элементов управления Windows см. в разделе Элементы управления.
Создание подкласса для элемента управления Windows, может потребоваться указать определенный стиль окна (WS_) или расширенный стиль окна (WS_EX_) (для использования в создании окно элемента управления. Можно задать значения этих параметров в функции-члене PreCreateWindow путем изменения структуры поля cs.style и cs.dwExStyle. Изменения этих полей должны выполняться с помощью операции OR, чтобы сохранить флажки, заданные по умолчанию классом COleControl. Например, если элемент управления создание подкласса для элемента управления "кнопка" и требуется элемент управления отображаться как флажок, введите следующую строку кода в реализацию CSampleCtrl::PreCreateWindow, перед возвращаемых выражением.
cs.style |= BS_CHECKBOX;
Эта операция добавляет флажок стиля BS_CHECKBOX, тогда как оставить флажок стиля по умолчанию (WS_CHILD) класса COleControl без изменений.
Изменение OnDraw функцию-член
Если требуется, чтобы элемент управления является подклассом сохранить одинаковый вид с соответствующий элемент управления Windows, функцию-член OnDraw для элемента управления должен содержать только вызов функцию-член DoSuperclassPaint, как показано в следующем примере:
void CMyAxSubCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
DoSuperclassPaint(pdc, rcBounds);
}
Функция-член DoSuperclassPaint, реализованный COleControl, использует оконную процедуры управления Windows для рисования элемента управления в указанном контексте устройства, внутри ограничивающего прямоугольника. Это делает элемент управления видимым даже в том случае, если оно не активен.
Примечание
Функция-член DoSuperclassPaint будет работать только с этими типами элементов управления, позволяющие контекст устройства, передаваемый как WPARAM сообщения WM_PAINT.Это включает некоторые из стандартных элементов управления Windows, например SCROLLBAR и кнопка, и все общие элементы управления.Для элементов управления, которые не поддерживают это расширение функциональности, необходимо предоставить собственный код для правильного отображения неактивного элемента управления.
Обработка отраженные сообщения окна
Некоторые элементы управления Windows обычно отправляют сообщения окна к их родительскому окну. Некоторые из этих сообщений, например WM_COMMAND, создают уведомлений действия пользователя. Другие, например WM_CTLCOLOR, используемые для получения сведений от родительского окна. Элемент управления ActiveX обычно взаимодействует с родительским окном иным путем. Уведомления связаны с порождать события (отправя уведомлений о событиях), и сведения о контейнере элементов управления осуществляется через внешние свойства контейнера. Поскольку эти методы взаимодействия существуют, контейнеры элементов управления ActiveX не ожидается процесса все окна сообщения, отправленные элементом управления.
Контейнер из предотвратить получение сообщения окна, является подклассом элемента управления Windows, COleControl создает дополнительное окно для использования ее в качестве родительского элемента управления. Это дополнительное свойство, отражателем окно «,» создается только для элементов управления ActiveX, который наследуется от класса элемента управления Windows и имеют одинаковый размер и положение в качестве окна элемента управления. Сообщения окна обработке окна приложения reflector некоторые и отправляет их обратно на элемент управления. Элемент управления в своей процедуре окна, может затем процесс эти отраженные сообщения, получив соответствующие действия для элемента управления ActiveX (например, увольняющ события). В разделе Идентификатор отраженные сообщения окна для списка перехваченных сообщений окон и соответствующие отраженных сообщений.
Контейнер элементов управления ActiveX может быть предназначен для выполнения отражение сообщения непосредственно, без необходимости в COleControl создать окно приложения reflector и снижает нагрузку является подклассом времени выполнения для управления Windows. COleControl определяет, поддерживает ли контейнер эту возможность, проверять свойства внешнего MessageReflect со значением TRUE.
Для обработки отраженное сообщение окна добавьте запись для сопоставления управляющего сообщения и реализуйте функцию обработчика. Поскольку отраженные сообщения не является частью стандартного набора сообщений, Windows, представление классов не поддерживает добавление таких обработчиков сообщений. Однако не могут добавить обработчик вручную.
Чтобы добавить обработчик сообщений для окна отраженных сообщений вручную выполните следующие действия:
В классе элемента управления. Файл H, объявляется функция обработчика. Функция должна иметь тип данных LRESULT и 2 параметров, с типами WPARAM и LPARAM соответственно. Примеры.
class CMyAxSubCtrl : public COleControl { ... protected: LRESULT OnOcmCommand(WPARAM wParam, LPARAM lParam); };
В cpp-файле класса элемента управления добавьте запись ON_MESSAGE к схеме сообщений. Параметры этой записи должны быть идентификатором сообщения и именем функции обработчика. Примеры.
BEGIN_MESSAGE_MAP(CMyAxSubCtrl, COleControl) ON_MESSAGE(OCM_COMMAND, &CMyAxSubCtrl::OnOcmCommand) END_MESSAGE_MAP()
Также в cpp-файле, реализуйте процесс функции-члена OnOcmCommand отраженное сообщение. Параметры WPARAM и LPARAM совпадает с исходной сообщения окна.
Пример того, как отраженные сообщения обрабатываются, относится к примеру элементов управления ActiveX MFC кнопка. Демонстрируется обработчик OnOcmCommand, определяющий код уведомлений BN_CLICKED и ответа, происходит (отправить событие click).