Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Библиотека классов Microsoft Foundation (MFC) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.
Элементы ActiveX — это обновленная версия спецификации элемента управления OLE.
Это важно
ActiveX — это устаревшая технология, которая не должна использоваться для новой разработки. Дополнительные сведения см. в разделе "Элементы ActiveX".
Элементы управления — это основная архитектура для разработки программируемых компонентов программного обеспечения, которые можно использовать в различных контейнерах, включая веб-браузеры с поддержкой COM в Интернете. Любой элемент ActiveX может быть элементом управления Интернетом и может добавлять его функции в активный документ или быть частью веб-страницы. Элементы управления на веб-странице могут взаимодействовать друг с другом с помощью скриптов.
Элементы ActiveX не ограничиваются использованием в Интернете. Элемент activeX также можно использовать в любом контейнере, если элемент управления поддерживает интерфейсы, необходимые для этого контейнера.
Элементы ActiveX имеют несколько преимуществ, в том числе:
Меньше обязательных интерфейсов, чем предыдущие элементы управления OLE.
Возможность быть без окон и всегда на месте активной.
Чтобы быть управляющим элементом ActiveX, контрольный элемент должен:
Поддерживайте интерфейс
IUnknown.Cтаньте COM-объектом.
Экспорт DLLRegisterServer и DLLUnRegisterServer.
Поддержка дополнительных интерфейсов при необходимости для функциональных возможностей.
Создание существующих элементов управления Internet-Friendly
Проектирование элемента управления, которое будет работать хорошо в интернет-среде, требует рассмотрения относительно низких скоростей передачи в Интернете. Вы можете использовать существующие элементы управления; однако необходимо выполнить действия, чтобы уменьшить размер кода и асинхронно скачать свойства элемента управления.
Чтобы повысить производительность элементов управления, следуйте приведенным ниже советам по вопросам эффективности.
Реализуйте методы, описанные в статье ActiveX Controls: оптимизация.
Рассмотрим, как создается экземпляр элемента управления.
Работайте асинхронно; не блокируйте другие программы.
Скачайте данные в небольших блоках.
При скачивании больших потоков, таких как растровые изображения или видео данные, получайте доступ к данным элемента управления асинхронно, в сотрудничестве с контейнером. Извлечение данных поэтапно или прогрессивно, в координации с другими элементами управления, которые также могут извлекать данные. Код также может загружаться асинхронно.
Скачайте код и свойства в фоновом режиме.
Станьте активными в пользовательском интерфейсе как можно быстрее.
Рассмотрим, как хранятся постоянные данные, как свойства, так и большие BLOB-объекты данных (например, растровое изображение или видео).
Элементы управления с значительным количеством постоянных данных, например большие растровые изображения или файлы AVI, требуют тщательного внимания к методу скачивания. Документ или страница становятся видимыми как можно скорее и позволяют пользователю взаимодействовать со страницей, а элементы управления получают данные в фоновом режиме.
Создавайте эффективные подпрограммы, чтобы сохранить размер кода и время выполнения.
Небольшие элементы управления кнопкой и меткой, с несколькими байтами постоянных данных, подходят для использования в среде Интернета и хорошо работают в браузерах.
Убедитесь, что прогресс передается контейнеру.
Уведомите контейнер хода выполнения асинхронной загрузки, в том числе, когда пользователь может начать взаимодействовать со страницей, и когда скачивание завершится. Контейнер может отображать ход выполнения (например, процент завершения) пользователю.
Рассмотрим способ регистрации элементов управления на клиентском компьютере.
Создание нового элемента управления ActiveX
При создании нового элемента управления с помощью мастера приложений можно включить поддержку асинхронных моникеров, а также других оптимизаций. Чтобы добавить поддержку для асинхронного скачивания свойств элемента управления, выполните следующие действия.
Создание проекта с помощью мастера управления ActiveX MFC
Щелкните "Создать" в меню "Файл ".
Выберите мастер элементов управления MFC ActiveX из проектов Visual Studio C++ и назовите проект.
На странице "Настройки управления" выберите "Загружать свойства асинхронно". При выборе этого параметра настраивается свойство готового состояния и событие изменения состояния готовности.
Вы также можете выбрать другие оптимизации, такие как активация без окон, которая описана в ActiveX Controls: Оптимизация.
Чтобы создать проект, нажмите кнопку Готово.
Создание класса, производного от CDataPathProperty
Создание класса, производного от
CDataPathProperty.В каждом из исходных файлов, включающих файл заголовка для элемента управления, добавьте файл заголовка для этого класса перед ним.
В этом классе переопределите
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класса.При изменении общего состояния элемента управления (например, от загрузки до инициализации или интерактивного режима пользователя), вызовите
COleControl::InternalSetReadyState. Если элемент управления имеет только одно свойство пути к данным, можно добавить код на BSCF_LASTDATANOTIFICATION , чтобы уведомить контейнер о завершении скачивания. Рассмотрим пример.if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }Переопределите
OnProgress. ВOnProgressпередается число, показывающее максимальный диапазон, и число, показывающее, насколько продвинулась текущая загрузка. Эти числа можно использовать для отображения состояния, такого как процент выполнения, для пользователя.
Следующая процедура добавляет свойство в элемент управления, чтобы использовать недавно производный класс.
Добавление свойства
В представлении классов щелкните правой кнопкой мыши интерфейс под узлом библиотеки и выберите "Добавить", а затем "Добавить свойство". Откроется мастер добавления свойств.
В мастере добавления свойств нажмите переключатель "Задать или получить методы ", введите имя свойства, например EditControlText, и выберите BSTR в качестве типа свойства.
Нажмите кнопку Готово.
Объявите переменную-член в вашем классе управления ActiveX для производного от него класса
CDataPathProperty.CMyDataPathProperty EditControlText;Реализуйте методы
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(); }В DoPropExchange добавьте следующую строку:
PX_DataPath(pPX, _T("DataPath"), EditControlText);Переопределите 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