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


Элементы управления ActiveX в Интернете

Элементы ActiveX — это обновленная версия спецификации элемента управления OLE.

Важно!

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

Элементы управления — это основная архитектура для разработки программируемых компонентов программного обеспечения, которые можно использовать в различных контейнерах, включая веб-браузеры с поддержкой COM в Интернете. Любой элемент ActiveX может быть элементом управления Интернетом и может добавлять его функции в активный документ или быть частью веб-страницы. Элементы управления на веб-странице могут взаимодействовать друг с другом с помощью скриптов.

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

Элементы ActiveX имеют несколько преимуществ, в том числе:

  • Меньше обязательных интерфейсов, чем предыдущие элементы управления OLE.

  • Возможность быть без оконной и всегда активной.

Чтобы быть элементом ActiveX, необходимо:

  • IUnknown Поддержка интерфейса.

  • Быть COM-объектом.

  • Экспорт DLLRegisterServer и DLLUnRegisterServer.

  • Поддержка дополнительных интерфейсов при необходимости для функциональных возможностей.

Создание существующих элементов управления в Интернете

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

Чтобы повысить производительность элементов управления, следуйте приведенным ниже советам по вопросам эффективности.

  • Реализуйте методы, описанные в статье ActiveX Controls: оптимизация.

  • Рассмотрим, как создается экземпляр элемента управления.

  • Быть асинхронным; не удерживайте другие программы.

  • Скачайте данные в небольших блоках.

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

  • Скачайте код и свойства в фоновом режиме.

  • Как можно быстрее станут активными в пользовательском интерфейсе.

  • Рассмотрим, как хранятся постоянные данные, как свойства, так и большие BLOB-объекты данных (например, растровое изображение или видео).

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

  • Создавайте эффективные подпрограммы, чтобы сохранить размер кода и время выполнения.

    Небольшие элементы управления кнопкой и меткой, с несколькими байтами постоянных данных, подходят для использования в среде Интернета и хорошо работают в браузерах.

  • Рассмотрите ход выполнения, который передается контейнеру.

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

  • Рассмотрим способ регистрации элементов управления на клиентском компьютере.

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

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

Создание проекта с помощью мастера управления ActiveX MFC

  1. Щелкните "Создать" в меню "Файл ".

  2. Выберите мастер элементов управления MFC ActiveX из проектов Visual Studio C++ и назовите проект.

  3. На странице "Элемент управления Параметры" выберите "Загрузки свойств" асинхронно. При выборе этого параметра настраивается свойство готового состояния и событие изменения состояния готовности.

    Вы также можете выбрать другие оптимизации, такие как активация без окон, которая описана в элементах activeX Controls: Оптимизация.

  4. Чтобы создать проект, нажмите кнопку Готово.

Создание класса, производного от CDataPathProperty

  1. Создание класса, производного от CDataPathProperty.

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

  3. В этом классе переопределите OnDataAvailable. Эта функция вызывается всякий раз, когда данные доступны для отображения. По мере того как данные становятся доступными, вы можете обрабатывать его любым способом, например путем постепенной отрисовки.

    Приведенный ниже фрагмент кода является простым примером постепенного отображения данных в элементе управления редактированием. Обратите внимание на использование флага BSCF_FIRSTDATANOTIFICATION для очистки элемента управления редактированием.

    void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
    {
       CListCtrl list_ctrl;
       CEdit *edit = list_ctrl.GetEditControl();
       if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd)
       {
          edit->SetSel(0, -1);
          edit->Clear();
       }
    
       if (dwSize > 0)
       {
          CString string;
          LPTSTR str = string.GetBuffer(dwSize);
          UINT nBytesRead = Read(str, dwSize);
          if (nBytesRead > 0)
          {
             string.ReleaseBuffer(nBytesRead);
             edit->SetSel(-1, -1);
             edit->ReplaceSel(string);
          }
       }
    }
    

    Обратите внимание, что необходимо включить AFXCMN. H для использования CListCtrl класса.

  4. При изменении общего состояния элемента управления (например, от загрузки до инициализированной или пользовательской интерактивной), вызовите COleControl::InternalSetReadyState. Если элемент управления имеет только одно свойство пути к данным, можно добавить код в BSCF_LASTDATANOTIFICATION , чтобы уведомить контейнер о завершении загрузки. Например:

    if (bscfFlag & BSCF_LASTDATANOTIFICATION)
    {
       GetControl()->InternalSetReadyState(READYSTATE_COMPLETE);
    }
    
  5. Переопределите OnProgress. В OnProgressэтом случае передается число, показывающее максимальный диапазон и число, показывающее, насколько далеко находится текущая загрузка. Эти числа можно использовать для отображения состояния, например процента завершения пользователю.

Следующая процедура добавляет свойство в элемент управления для использования класса, просто производного.

Добавление свойства

  1. В представлении классов щелкните правой кнопкой мыши интерфейс под узлом библиотеки и выберите "Добавить", а затем "Добавить свойство". Откроется мастер добавления свойств.

  2. В мастере добавления свойств нажмите переключатель "Задать или получить методы", введите имя свойства, например EditControlText, и выберите BSTR в качестве типа свойства.

  3. Нажмите кнопку Готово.

  4. Объявите переменную-член класса CDataPathProperty, производного от вашего класса ActiveX, в класс управления ActiveX.

    CMyDataPathProperty EditControlText;
    
  5. Реализуйте методы Get/Set. Для Getэтого верните строку. Для Set, загрузите свойство и вызов SetModifiedFlag.

    BSTR CMFCActiveXControlCtrl::GetEditControlText(void)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       CString strResult;
       strResult = EditControlText.GetPath();
       return strResult.AllocSysString();
    }
    
    void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal)
    {
       AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
       Load(newVal, EditControlText);
       SetModifiedFlag();
    }
    
  6. В DoPropExchange добавьте следующую строку:

    PX_DataPath(pPX, _T("DataPath"), EditControlText);
    
  7. Переопределите ResetData , чтобы уведомить свойство о сбросе его элемента управления, добавив следующую строку:

    EditControlText.ResetData();
    

Определение того, следует ли наследовать от CDataPathProperty или CCachedDataPathProperty

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

Вы также можете получить производный от CCachedDataPathProperty. В этом случае скачанные данные кэшируются в файле памяти. Это хороший выбор, если вам нужно сохранить все скачанные данные, например элемент управления, который постепенно отрисовывает растровое изображение. В этом случае класс имеет переменную-член, содержащую данные:

CMemFile m_Cache;

В классе элементов управления ActiveX этот файл, сопоставленный с памятью, можно использовать для OnDraw отображения данных. В производном классе элемента CCachedDataPathPropertyActiveX переопределите функцию-член OnDataAvailable и опустите элемент управления после вызова реализации базового класса.

void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
   CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
   GetControl()->InvalidateControl();
}

Асинхронное скачивание данных с помощью элементов ActiveX

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

Асинхронные моникеры предоставляют способ асинхронного скачивания данных по сети. Операция чтения в асинхронном моникере возвращается немедленно, даже если операция не завершена.

Например, если доступно только 10 байтов и чтение вызывается асинхронно в файле 1K, чтение не блокируется, но возвращается с текущим доступным 10 байтами.

Вы реализуете асинхронные моникеры с помощью CAsyncMonikerFile класса. Однако элементы activeX могут использовать класс, производный CDataPathProperty от CAsyncMonikerFileэтого, для реализации асинхронных свойств элемента управления.

Отображение элемента управления на веб-странице

Ниже приведен пример тега объекта и атрибутов для вставки элемента управления на веб-странице.

<OBJECT
  CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
  CODEBASE="/ie/download/activex/iechart.ocx"
  ID=chart1
  WIDTH=400
  HEIGHT=200
  ALIGN=center
  HSPACE=0
  VSPACE=0>
  <PARAM NAME="BackColor" value="#ffffff"/>
  <PARAM NAME="ForeColor" value="#0000ff"/>
  <PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>

Обновление существующего элемента управления OLE для использования новых функций элемента управления ActiveX

Если элемент управления OLE был создан с версией Visual C++ до 4.2, вы можете выполнить действия по повышению производительности и улучшению ее функциональности. Подробные сведения об этих изменениях см. в разделе "Элементы ActiveX: оптимизация".

Если вы добавляете поддержку асинхронного свойства в существующий элемент управления, необходимо добавить готовое свойство состояния и ReadyStateChange событие самостоятельно. В конструкторе элемента управления добавьте:

m_lReadyState = READYSTATE_LOADING;

Состояние готовности будет обновлено при скачивании кода путем вызова COleControl::InternalSetReadyState. Одно место, которое можно вызвать InternalSetReadyState , — из OnProgress переопределения производного CDataPathPropertyкласса.

См. также

Задачи программирования для интернет-решений MFC
Основы программирования для интернет-решений MFC