Опубликован: 17.08.2010 | Доступ: свободный | Студентов: 999 / 59 | Оценка: 4.11 / 3.89 | Длительность: 29:38:00
Самостоятельная работа 18:

Создание собственного элемента управления ActiveX

Настройка вкладки General

Вкладка General пока не включает в себя никаких свойств. Настроим ее так, чтобы она позволяла просматривать и устанавливать свойство UpdateInterval, добавленное к компоненту нами ранее и управляющее частотой срабатывания таймера.

Для настройки страницы свойств General нам нужно работать с диалоговой панелью IDD_PROPPAGE_MYCLOCK, автоматически созданной оболочкой проекта.

  • В панели Resource View оболочки раскройте узел Dialog

  • Вызовите на редактирование диалоговый ресурс IDD_PROPPAGE_MYCLOCK
  • Удалите статический текст из формы
  • Поместите на форму текстовую метку Static Text и дайте ей значение UpdateInterval:. Она будет служить маркером простого поля редактирования
  • Поместите на форму правее текстовой метки простое поле редактирования Edit Control и присвойте ему идентификатор IDC_UPDATE_INTERVAL
  • Выровняйте компоненты относительно формы, чтобы они смотрелись так

Ни в коем случае не меняйте размеры диалогового окна!!! Они автоматически генерируются оболочкой и должны быть равны 250x62 или 250x110. Любые другие размеры вкладки свойств General нестандартны и при их использовании могут возникнуть проблемы или, по крайней мере, предупреждения.

Теперь нам нужно связать введенную ранее переменную m_UpdateInterval, хранящую значение периода срабатывания таймера, и поле редактирования. Но прежде нужно создать для поля редактирования свою ассоциированную с ним переменную.

  • Выберите в панели Class View проекта класс CMyClockPropPage
  • Через контекстное меню вызовите для этого класса мастер добавления переменной, который настройте так

Теперь модифицируем обмен данными с целью привязки переменной m_UpdateInterval поля редактирования вкладки General с переменной m_UpdateInterval элемента управления MyClock. Это нужно выполнить вручную, потому что средства в оболочке для такого действия нет.

  • Откройте файл исходного кода MyClockPropPage.cpp
  • Найдите реализацию функции DoDataExchange(). Модифицируйте ее путем добавления к функции DDX функции DDP, чтобы окончательный результат выглядел так
    Модифицированный код функции DoDataExchange() файла MyClockPropPage.cpp
    void CMyClockPropPage::DoDataExchange(CDataExchange* pDX)
    {
      DDX_Text(pDX, IDC_UPDATE_INTERVAL, m_UpdateInterval);
      DDP_Text(pDX, IDC_UPDATE_INTERVAL, m_UpdateInterval,
             _T("UpdateInterval"));
    
      DDP_PostProcessing(pDX);
    }

Код организует двухступенчатый обмен данными: сначало между полем редактирования и ассоциированной с ним переменной, затем между этой переменной и переменной, хранящей значение свойства элемента управления. Обратите внимание, что модифицированный код должен стоять впереди вызова функции активизации процесса обмена DDP_PostProcessing(pDX) .

  • Проверьте работу вкладки General через тестовую утилиту, как мы это уже неоднократно проделывали, и убедитесь, что поле вкладки управляет периодом срабатывания таймера компонента MyClock

Результат наших усилий внешне должен выглядеть так


Включение событий в элемент управления MyClock

Включение событий в элемент управления открывает для него канал приема сообщений от Windows о действиях пользователя, когда элемент получает фокус ввода. Различают базовые ( Stock - готовые) события и специальные ( Custom - пользовательские).

Включение базовых событий

Базовые события ( Stock ), которые мы можем добавить в элемент управления - предопределены и приведены в таблице

Базовые события элементов управления
Click DblClick Error KeyDown KeyPress
KeyUp MouseDown MouseMove MouseUp ReadyStateChanged

Имена базовых событий построены на основании того, что происходит. Если мы предусмотрим события в элементе управления, то будущий пользователь нашего элемента (программист) или мы сами можем в дальнейшем посадить на них обработчики. Добавление событий выполняет мастер Add Events Wizard.

Для практики включим в MyClock два события: Click и DblClick.

  • В панели Class View выберите CMyClockCtrl
  • Щелкните на нем правой кнопкой мыши и выберите из контекстного меню пункты Add/Add Event

Появится мастер добавления событий


Мастер имеет два режима добавления события: Stock (готовый, базовый) и Custom (пользовательский, прочий). В нижней части мастера расположена область для добавления параметров, которые можно передать из элемента управления в приложение-контейнер (то, что использует элемент управления и организует управление им) вместе с событием.

  • В раскрывающемся списке поля Event name установите событие Click и нажмите кнопку Finish
  • Такое же действие повторите для добавления события DblClick

В файле MyClockCtrl.cpp мастер добавит код в карту событий

Карта событий файла MyClockCtrl.cpp
// Event map
  
BEGIN_EVENT_MAP(CMyClockCtrl, COleControl)
  EVENT_STOCK_CLICK()
  EVENT_STOCK_DBLCLICK()
END_EVENT_MAP()

В файле MyClock.idl мастер добавит код объявлений обработчиков событий

Объявление обработчиков событий файла MyClock.idl
....................................
  //  Event dispatch interface for CMyClockCtrl
  
  [ uuid(1E47AE17-F799-44FC-9C13-9E3DD23D5540),
    helpstring("Event interface for MyClock Control") ]
  dispinterface _DMyClockEvents
  {
    properties:
      //  Event interface has no properties
  
    methods:
    [id(DISPID_CLICK)] void Click(void);
    [id(DISPID_DBLCLICK)] void DblClick(void);
  };
....................................

Мы закончили включение базовых событий Click и DblClick в элемент управления MyClock. Это означает, что другие лица, которые будут использовать наш элемент управления в своих программах, такие, например, как программисты-господа Панасюк, Сизых, Рублев или просто-программисты Жук, Фирстов, Вильгельм, Косенок, Цех, Даниленко, Непомнящий будут иметь возможность связать свой код не только с салом, но и с этими событиями.

Для того, чтобы убедиться, что элемент управления MyClock сейчас имеет события Click и DblClick, выполните следующее:

  • Постройте приложение
  • Выполните команду главного меню оболочки Tools/ActiveX Control Test Container
  • В появившемся окне утилиты ActiveX Control Test Container выполните команду Edit/Insert New Control... (или нажмите на значке New Control с изображением руки)

  • В появившемся диалоговом окне Insert Control найдите наш элемент управления MyClock

  • Щелкните по кнопке OK и в клиентской области окна утилиты появится элемент управления MyClock
  • Убедитесь, что элемент управления выделен в окне утилиты
  • Выполните команду Control/Logging...

  • В появившемся диалоговом окне Control Logging Options включите вкладку Evens

Мы видим, что события Click и DblClick действительно добавлены в элемент управления.

  • Закройте диалоговое окно Control Logging Options
  • Пощелкайте мышью на элементе управления

Мы видим, что в нижней части окна тестовая утилита регистрирует генерируемые элементом управления события Click и DblClick


Заметьте, что не имеет значения, какой кнопкой мыши мы щелкнули. При выполнении двойного щелчка утилита регистрирует сразу два события - Click и DblClick, поскольку первый щелчок в двойном щелчке является обычным щелчком.

  • Щелкните правой кнопкой мыши в нижней части окна утилиты по списку регистрации событий и через контекстное меню выполните команду Clear, чтобы очистить список
  • Закройте утилиту ActiveX Control Test Container без сохранения
Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .