Стоит Windows 8 Pro, Visual Studio 2010 Express Edition . |
Создание собственного элемента управления 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 без сохранения