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

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

Аннотация: Создание проекта элемента управления MyClock.OCX. Добавление свойства UpdateInterval. Использование таблицы свойств элемента управления MyClock для удобства тестирования. Настройка вкладки General. Включение событий в элемент управления MyClock. Включение базовых событий. Включение специального события. Генерация события NewMinute. Включение специальных методов в элемент управления MyClock. Редактирование заготовок реализации методов. Изменение системного имени компонента и включение его в панель Toolbox оболочки. Построение каркаса приложения. Проектирование интерфейса приложения. Добавление ассоциированных переменных к элементам управления. Инициализация ассоциированных переменных. Построение обработчиков.
Файлы к данной лабораторной работе, Вы можете скачать здесь.

Элемент управления ActiveX можно разрабатывать самим, затем любой программист в состоянии его использовать точно также, как стандартный элемент управления. Готовый элемент управления размещается на диалоговой панели и настраивается установкой значений свойств и обработчиков событий.

Поскольку расширением файла элемента управления ActiveX является .OCX, то иногда элементы управления называют элементами OCX.

Далее в этой работе мы создадим и протестируем свой собственный элемент управления ActiveX - MyClock.OCX, который будет выполнять задачу непрерывного вывода текущего времени. Далее мы присоединим готовый компонент в панель Toolbox оболочки, чтобы его можно было использовать в любом приложении наряду со стандартными компонентами.

Создание проекта элемента управления MyClock.OCX

  • Войдите в свой каталог выполнения лабораторных работ
  • Запустите оболочку Microsoft Visual Studio .NET 2003
  • Создайте новый проект и назовите его MyClock

  • Настройте мастер App Wizard, оставив все установки по умолчанию, которые будут выглядеть так



  • Установите в раскрывающемся списке Solution Configurations режим построения решения Release

Тестирование элемента управления MyClock

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

  • Выполните компиляцию и компоновку проекта

  • Войдите в каталог проекта Release и убедитесь, что создан файл MyClock.ocx

Чтобы протестировать элемент управления, нужно создать тестовое приложение, которое его использует, как это было с календарем в Lab17. Но на начальной стадии проще воспользоваться утилитой ActiveX Control Test Container, которая предоставляет такие возможности без построения тестового приложения.

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

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

  • Щелкните по кнопке OK и в клиентской области окна утилиты появится элемент управления MyClock

Элемент управления MyClock рисует в окне утилиты эллипс для начального контроля за способностью изменять размеры. Этот эллипс создан каркасным кодом оболочки в функции OnDraw(). Рамка с маркерами позволяет изменять размеры элемента управления, а сам элемент можно перетаскивать в окне утилиты. Можно поместить в окно утилиты несколько элементов управления.

  • Через кнопку New Control панели инструментов утилиты еще раз вызовите диалоговое окно Insert Control и разместите в клиентской области окна утилиты еще один экземпляр элемента управления MyClock

Таким образом, с помощью утилиты ActiveX Control Test Container на данном этапе мы протестировали визуальный аспект элемента управления MyClock: способность размещаться в родительском окне-контейнере, изменять размеры и местоположение, размещаться в контейнере несколькими копиями.

Утилита позволяет протестировать свойства и события элемента управления, но на данном этапе нам тестировать нечего, поскольку свойства и события в MyClock нами еще не определены.

  • Закройте ( без сохранения изменений) утилиту ActiveX Control Test Container, чтобы завершить процесс предварительного тестирования

Настройка значка инструмента MyClock

Все управляющие элементы, размещенные в панели Toolbox оболочки, представлены на ней кнопками с пиктограммой и надписью. Подготовим подходящий значок для нашего элемента управления.

  • В панели Resource View раскройте узел Bitmap и вызовите на редактирование ресурс IDB_MYCLOCK
  • Воспользуйтесь расположенными в верхней части оболочки кнопками редактора Image Editor и замените значок по умолчанию


    на более подходящий, например такой


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

Пока элемент управления выводит только пустой эллипс. Нам нужно, чтобы в нем отображалось текущее время в виде текста. Напишем соответствующий код.

  • В панели Solution Explorer вызовите на редактирование файл MyClockCtrl.cpp
  • Найдите в нем функцию OnDraw(). Сейчас она выглядит так
    Код функции OnDraw(), сгенерированный мастером
    void CMyClockCtrl::OnDraw(
          CDC* pdc, 
          const CRect& rcBounds, 
          const CRect& rcInvalid)
    {
      if (!pdc)
        return;
      
      // TODO: Replace the following code with your own drawing code.
      pdc->FillRect(rcBounds, 
         CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
      pdc->Ellipse(rcBounds);
    }

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

  • Замените в функции OnDraw() последний оператор так, чтобы вместо эллипса для проверки внутри выводилась текстовая "затычка" ( заглушка )
    Измененный код функции OnDraw()
    void CMyClockCtrl::OnDraw(
          CDC* pdc, 
          const CRect& rcBounds, 
          const CRect& rcInvalid)
    {
      if (!pdc)
        return;
      
      // TODO: Replace the following code with your own drawing code.
      
      // Залить элемент управления
      pdc->FillRect(rcBounds, 
        CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
    //  pdc->Ellipse(rcBounds); // Построить эллипс
      
      // Вывести текст
      CString m_str = "Это мой первый ActiveX";
      pdc->ExtTextOut(rcBounds.left,
        rcBounds.top,
        ETO_CLIPPED,
        rcBounds,
        m_str,
        m_str.GetLength(),
        NULL);
    }

Функция вывода текста MFC -класса CDC имеет такие аргументы

  • Первые два параметра задают верхний левый угол начало вывода текста.
  • Третий параметр определяет, как будет выводиться текст. В нашем случае макрос ETO_CLIPPED устанавливает, что текст будет усечен границами прямоугольной области.
  • Четвертый параметр задает прямоугольную область, в которую будет выведен текст. В нашем случае это область размещения элемента управления.
  • Пятый параметр является строкой с текстом типа CString.
  • Шестой параметр задает длину строки текста в символах текста.
  • Седьмой параметр (необязательный) задает пробелы между символами строки. Если его значение установлено в NULL, то пробелы между символами заданы по умолчанию.

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

  • Постройте проект и проверьте его в утилите ActiveX Control Test Container

Должен получиться такой результат


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