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

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

Включение методов в элемент управления MyClock

Помимо свойств и событий в элемент управления можно включать и методы, которые аналогичны функциям-членам классов C++. После того, как мы включим в элемент управления какой-либо метод, другие программисты, которые будут использовать наш элемент управления в своих программах, такие, например, как Панасюк, Сизых, Рублев и другие, сразу же заимеют возможность обращаться к этому методу как к своему кровному.

Предположим, что мы включили в элемент управления метод с условным именем MyMethod(). Предположим также, что некий студент-программист с условной фамилией Иванов включил впоследствии наш элемент управления MyClock в свою программу и назвал его экземпляр условно SaLo. После этого в своей программе студент-программист Иванов сможет написать следующий оператор

SaLo.MyMethod();

и тем самым применит метод к экземпляру SaLo элемента управления.

Встроенный метод AboutBox()

При создании заготовки проекта элемента управления оболочка автоматически генерирует код для метода AboutBox(). Когда программист, использующий наш элемент управления, вызывает в своей программе метод AboutBox(), появляется диалоговое окно About.

Перед тем, как включить в элемент управления свой собственный метод, проверим работу метода AboutBox(), который создал мастер приложения.

  • Постройте проект и поместите в тестовую утилиту ActiveX Control Test Container наш элемент управления MyClock
  • Обращая внимание, чтобы элемент управления был выделен, выполните пункт меню утилиты Control/Invoke Methods...

  • В появившемся диалоговом окне Invoke Methods установите в раскрывающемся списке метод AboutBox() и щелкните по кнопке Invoke

На экране появится заготовка диалогового окна About


Метод существует и он работает!

  • Закройте тестовую утилиту и отредактируйте диалоговое окно About так, чтобы не стыдно было показать самой студентке Ельцовой - которая в этом деле добре разбирается (Ельцова, я восхищаюсь!)

Ресурс About имеет имя IDD_ABOUTBOX_MYCLOCK в панели ресурсов Resource View. Мой About выглядит так


Включение базового метода в элемент управления MyClock

Базовые методы предопределены в оболочке VS.NET 2003. Их только два: DoClick() и Refresh().

Метод DoClick() имитирует щелчок на элементе управления, как будто бы пользователь щелкнул на нем. При выполнении метода Refresh() элемент управления перерисовывает сам себя, вызывая функцию OnDraw().

Для практики включим в элемент управления MyClock метод Refresh().

  • Откройте панель Class View и раскройте узел MyClockLib, а затем узел _DMyClock. Убедитесь, что там уже находится метод AboutBox()

  • Щелкните правой кнопкой мыши на узле _DMyClock или узле _DMyClockEvents (это безразлично).
  • Через контекстное меню Add/Add Method вызовите мастер добавления метода.
  • Раскройте список Method name: и выберите имя Refresh

Сейчас окно мастера должно выглядеть так


  • Щелкните по кнопке Finish, чтобы добавить метод Refresh() в проект элемента управления
  • Вновь откройте панель Class View оболочки и убедитесь, что метод Refresh() появился в списке методов узла _DMyClock в компанию к методу AboutBox()

Тестирование включенного базового метода Refresh()

Вспомним, что при выполнении метода Refresh() элемент управления MyClock должен перерисовывать сам себя, вызывая функцию OnDraw(). Сейчас же пока функция OnDraw() вызывается по сообщению WM_TIMER, генерируемому таймером. Если мы установим период срабатывания таймера заведемо большим, то функция OnDraw() будет обновлять окно элемента управления очень редко. Если в больших промежутках между срабатыванием таймера мы будем вызывать метод Refresh(), который должен обновлять окно, то сможем убедиться, что он работает.

Испытания метода Refresh() проведем следующим образом

  • Постройте проект, чтобы обновить внесенные в MyClock изменения
  • Запустите утилиту тестирования ActiveX Control Test Container и поместите в нее наш элемент управления MyClock
  • При выделенном элементе управления щелкните по кнопке Properties, чтобы вызвать окно свойств

  • В появившемся окне свойств выберите отредактированную нами ранее вкладку General и установите в поле UpdateInterval какое-нибудь большое число, например 55 секунд

  • Нажмите кнопку Применить и закройте окно свойств. Таймер элемента управления MyClock будет переведен на интервал срабатывания 55 секунд и можно продолжить испытание метода Refresh()
  • Нажмите кнопку OK или Отмена, чтобы закрыть окно свойств
  • При выделенном элементе управления выполните команду меню утилиты Control/Invoke Methods...

  • В появившемся диалоговом окне Invoke Methods выберите в раскрывающемся списке добавленный нами метод Refresh()

  • Сдвиньте окно Invoke Methods так, чтобы видеть элемент управления
  • Щелкая по кнопке Invoke убедитесь, что окно принудительно перерисовывается функцией OnDraw(), в тело которой мы ранее разместили код обновления времени

Добавленный нами метод Refresh() работает!

  • Закройте окно тестовой утилиты без сохранения
Включение специальных методов в элемент управления MyClock

Поскольку, как мы уже убедились, базовых методов всего два, а этого даже на сало не хватит, рассмотрим возможность добавления пользовательских ( Custom ) методов. Для примера добавим три пользовательских метода

  1. StartClock() - для запуска часов
  2. BeepClock() - для запуска или остановки будильника

Для добавления метода StartClock() выполните следующее

  • Откройте панель Class View и раскройте узел MyClockLib, а затем узел интерфейса _DMyClock
  • Щелкните правой кнопкой мыши на узле _DMyClock и через контекстное меню Add/Add Method вызовите мастер добавления метода
  • Укажите в поле Method name имя добавляемого метода StartClock. Поле Internal name внутреннего имени заполнится автоматически на основе введенного внешнего имени
  • В поле Return type из раскрывающегося списка выбирете тип void
  • Щелкните по кнопке Finish
  • Для добавления метода StopClock() повторите те же шаги, которые выполнили для StartClock()

Метод BeepClock() создадим с аргументом типа BYTE (unsigned char) , который будет принимать ненулевое (включить звонок) или нулевое (выключить звонок) значения.

  • Снова откройте панель Class View и раскройте узел MyClockLib, а затем узел интерфейса _DMyClock
  • Щелкните правой кнопкой мыши на узле _DMyClock и через контекстное меню Add/Add Method вызовите мастер добавления метода
  • Укажите в поле Method name имя добавляемого метода BeepClock

Поле Internal name внутреннего имени заполнится автоматически на основе введенного внешнего имени.

  • В поле Return type из раскрывающегося списка выбирете тип void
  • В поле Parameter type из раскрывающегося списка выбирете значение BYTE, а в поле Parameter name введите beep

Окно мастера должно выглядеть так


  • Щелкните по кнопке Add
  • Щелкните по кнопке Finish
  • Откройте панель Class View и убедитесь, что добавленные методы присутствуют в интерфейсе элемента управления

  • Перейдите в панель Solution Explorer и откройте в ней файл MyClockCtrl.cpp
  • Перейдите в конец файла MyClockCtrl.cpp и убедитесь, что мастер вместе с добавлением пользовательских методов создал и заготовки кода для их реализации

Обратите внимание, что заготовка для встроенного метода Refresh() отсутствует.

Александр Даниленко
Александр Даниленко
Стоит Windows 8 Pro, Visual Studio 2010 Express Edition .