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


Элементы управления ActiveX в MFC. Создание подкласса элемента управления Windows

В этой статье описывается процесс подкласса общего элемента управления Windows для создания элемента activeX. Подкласс существующего элемента управления Windows — это быстрый способ разработки элемента activeX. Новый элемент управления будет иметь возможности подклассированного элемента управления Windows, например рисование и реагирование на щелчки мыши. Пример элемента управления ActiveX MFC — это пример подкласса элемента управления Windows.

Важно!

ActiveX — это устаревшая технология, которую не следует использовать для новых разработок. Дополнительные сведения о современных технологиях, которые заменяют ActiveX, см. в разделе Элементы ActiveX.

Чтобы подклассить элемент управления Windows, выполните следующие задачи:

Переопределение IsSubclassedControl и PreCreateWindow

Чтобы переопределить PreCreateWindow и IsSubclassedControlдобавьте следующие строки кода в protected раздел объявления класса элемента управления:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
BOOL IsSubclassedControl();

В файле реализации элемента управления (. CPP), добавьте следующие строки кода для реализации двух переопределенных функций:

// 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. Например, если элемент управления подклассом элемента управления BUTTON и вы хотите, чтобы элемент управления отображался в виде поля проверка, вставьте следующую строку кода в реализацию CSampleCtrl::PreCreateWindowперед оператором return:

cs.style |= BS_CHECKBOX;

Эта операция добавляет флаг стиля BS_CHECКБ OX, оставляя флаг стиля по умолчанию (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 и BUTTON, и все общие элементы управления. Для элементов управления, которые не поддерживают это поведение, необходимо предоставить собственный код для правильного отображения неактивного элемента управления.

Обработка сообщений Рефлексия окна

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

Чтобы запретить контейнеру получать сообщения окна, отправленные подклассным элементом управления Windows, COleControl создает дополнительное окно, чтобы служить родительским элементом элемента управления. Это дополнительное окно, называемое "отражателем", создается только для элемента ActiveX, который подклассирует элемент управления Windows и имеет тот же размер и положение, что и окно управления. Окно отражателя перехватывает определенные сообщения окна и отправляет их обратно в элемент управления. Затем элемент управления в своей процедуре окна может обрабатывать эти отраженные сообщения, выполняя действия, соответствующие элементу activeX (например, запуск события). Список перехватанных сообщений windows и их соответствующих сообщений см. в Рефлексия идентификаторах сообщений окна.

Контейнер элементов управления ActiveX может быть разработан для самостоятельного отражения сообщений, устраняя необходимость COleControl создания окна отражателя и уменьшения затрат на время выполнения для подклассного элемента управления Windows. COleControlОпределяет, поддерживает ли контейнер эту возможность, проверка для свойства Message Рефлексия окружающего свойства со значением TRUE.

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

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

  • В классе элемента управления. H-файл, объявите функцию обработчика. Функция должна иметь тип возвращаемого значения LRESULT и два параметра с типами 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