Поделиться через


Элементы управления ActiveX MFC: Subclassing окна контролирует

В данной статье описан процесс subclassing общее управление окнами для создания элемента управления ActiveX.Subclassing существующий элемент управления окнами быстрый способ разработки элемента управления ActiveX.Новый элемент управления будет иметь возможности subclassed управления windows forms, такие как рисование и обработка щелчка мыши.Пример кнопка элементами управления ActiveX MFC примере subclassing управления windows.

В подклассу окна элемента управления, завершаются следующие задачи:

  • Переопределяет функции-члены IsSubclassedControl и PreCreateWindow COleControl

  • Измените функции-члена OnDraw

  • Обработка всех сообщений элемент управления ActiveX (OCM) отраженные к элементу управления

    ПримечаниеПримечание

    Многие из этого рабочего процесса выполняется автоматически с помощью мастера элементов управления ActiveX, если выбран элемент управления subclassed с помощью раскрывающегося списка на странице Выбрать класс родительского окнаПараметры элементов управления.

См. статью базы знаний Q243454 дополнительные сведения о subclassing элемент управления.

Переопределение 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;
}

Обратите внимание, что в этом примере элемент управления " Кнопка " окон определено в PreCreateWindow.Однако все стандартные элементы управления windows forms можно subclassed.Дополнительные сведения о стандартных элементах управления windows forms см. в разделе Элементы управления.

При subclassing окна элемент управления может потребоваться указать определенный стиль окна (WS_) или расширенный стиль окна (WS_EX_) пометит для создания окна элемента управления.Можно задать значения для этих параметров в функции-члене PreCreateWindow путем изменения cs.style и полей структуры cs.dwExStyle.Изменения этих полей должны быть сделаны с помощью операции OR, чтобы сохранить флаги значения по умолчанию, которые задаются классом COleControl.Например, если элемент управления subclassing элемент управления " Кнопка " и требуется элемент управления отображаться как флажок, вставьте следующую строку кода в реализацию CSampleCtrl::PreCreateWindow перед возвращаемой выпиской:

cs.style |= BS_CHECKBOX;

Эта операция добавляет пометить стиля BS_CHECKBOX, оставляя по умолчанию пометить стиля (WS_CHILD) класса COleControl неизменной.

Изменение функции-члена OnDraw

Для subclassed элемент управления содержать один и тот же тип, что соответствовать управления 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 forms, такие как SCROLLBAR и кнопка и все общие элементы управления.Для элементов управления, которые не поддерживают эти расширения функциональности следует предоставить собственный код для отображения правильного неактивного элемента управления.

Обработка отраженные сообщения окна

Обычно управления windows отправляет некоторые сообщения окна к их родительскому окну.Некоторые из этих сообщений, например WM_COMMAND, предоставляют уведомление действия пользователем.Другие, например WM_CTLCOLOR, используемые для получения сведений от родительского окна.Элемент управления ActiveX обычно обеспечивается путем взаимодействует с родительского окна.Уведомления связаны с приостанавливается при срабатывании события (при отправке уведомлений о событиях), а сведения о контейнере элемента управления получено путем обращения к свойствам окружения контейнера.Поскольку эти методы существуют ссылки, не ожидается, что процесс контейнеры элемент управления ActiveX все сообщения окна, отправляемых элементом управления.

Предотвратить получение сообщений, отправляемых контейнер из окна subclassed управлением windows, COleControl создает дополнительное окно в качестве родительского элемента управления.Это дополнительное поле с именем «отражателем» создается только для элементов управления ActiveX, подклассы окна контролируют и имеет тот же размер и положение как окно элемента управления.Перехватывает сообщения окна рефлектор некоторые окна и отправляет их обратно к элементу управления.Элемент управления в его процедуре окна, затем может обработать эти отраженные сообщения путем создания действия, необходимые для элемента управления ActiveX (например, горящ событие).См. раздел Отраженные сообщения окна идентификаторов список перехваченных сообщений окон и соответствующие им автоматически устанавливанных сообщений.

Контейнер элементов управления ActiveX может быть предназначен для выполнения отражения является устранение необходимости сообщения, для COleControl создать окно " рефлектор и уменьшение издержек времени выполнения для subclassed управления windows.COleControl определяет, поддерживает ли контейнер эту возможность, установив для свойства внешнего MessageReflect со значением Истина.

Для обработки отраженное сообщение окна, добавьте запись для сопоставления, управляющего сообщения и реализуйте функцию обработчика.Поскольку отраженные сообщения не является частью стандартного набора сообщений, определенных окон, представление классов не поддерживает добавление таких обработчиков сообщений.Однако не сложно добавления обработчика вручную.

Чтобы добавить обработчик сообщений для отраженного сообщения окна вручную выполните следующие действия:

  • в классе элемента управления. Файл 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.

См. также

Основные понятия

Элементы управления ActiveX MFC