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


Элементы управления ActiveX в MFC. Сериализация

В этой статье описывается сериализация элемента управления ActiveX. Сериализация — это процесс чтения или записи в носитель постоянного хранилища, например файл диска. Библиотека классов Microsoft Foundation (MFC) обеспечивает встроенную поддержку сериализации в классе CObject. COleControl расширяет эту поддержку элементов activeX с помощью механизма обмена свойствами.

Важно!

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

Сериализация для элементов ActiveX реализуется путем переопределения COleControl::D oPropExchange. Эта функция, вызываемая во время загрузки и сохранения объекта элемента управления, сохраняет все свойства, реализованные с помощью переменной-члена или переменной-члена с уведомлением об изменении.

В следующих разделах рассматриваются основные проблемы, связанные с сериализации элемента управления ActiveX:

Реализация функции DoPropExchange

При использовании мастера управления ActiveX для создания проекта элемента управления несколько функций обработчика по умолчанию автоматически добавляются в класс управления, включая реализацию COleControl::D oPropExchange по умолчанию. В следующем примере показан код, добавленный к классам, созданным с помощью мастера управления ActiveX:

void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   // TODO: Call PX_ functions for each persistent custom property.
}

Если вы хотите сделать свойство постоянным, измените DoPropExchange , добавив вызов функции обмена свойствами. В следующем примере показано сериализация пользовательского логического свойства CircleShape, где свойство CircleShape имеет значение true по умолчанию:

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

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

Функции обмена свойствами Назначение
PX_Blob( ) Сериализует свойство данных типа Binary Large Object (BLOB).
PX_Bool( ) Сериализует логическое свойство типа.
PX_Color( ) Сериализует свойство цвета типа.
PX_Currency( ) Сериализует свойство типа CY (currency).
PX_Double( ) Сериализует свойство типа double .
PX_Font( ) Сериализует свойство типа шрифта.
PX_Float( ) Сериализует свойство типа float .
PX_IUnknown( ) Сериализует свойство типа LPUNKNOWN.
PX_Long( ) Сериализует свойство типа long .
PX_Picture( ) Сериализует свойство type Picture.
PX_Short( ) Сериализует свойство типа short .
PXstring( ) Сериализует свойство типа CString .
PX_ULong( ) Сериализует свойство ULONG типа.
PX_UShort( ) Сериализует свойство USHORT типа.

Дополнительные сведения об этих функциях обмена свойствами см. в разделе "Сохраняемость элементов управления OLE" в справочнике по MFC.

Настройка поведения DoPropExchange по умолчанию

Реализация по умолчанию DoPropertyExchange (как показано в предыдущем разделе) вызывает базовый класс COleControl. Это сериализует набор свойств, которые автоматически поддерживаются COleControl, что использует больше места в хранилище, чем сериализация только пользовательских свойств элемента управления. Удаление этого вызова позволяет объекту сериализовать только те свойства, которые вы считаете важными. Любое свойство акций указывает, что элемент управления реализован не будет сериализован при сохранении или загрузке объекта элемента управления, если вы явно не добавите PX_ вызовы для них.

Реализация поддержки версий

Поддержка версий позволяет обновленному элементу ActiveX добавлять новые постоянные свойства и по-прежнему иметь возможность обнаруживать и загружать постоянное состояние, созданное более ранней версией элемента управления. Чтобы сделать версию элемента управления доступной в рамках постоянных данных, вызовите COleControl::ExchangeVersion в функции элемента управления DoPropExchange . Этот вызов автоматически вставляется, если элемент activeX был создан с помощью мастера элементов управления ActiveX. Его можно удалить, если поддержка версий не нужна. Однако затраты на размер элемента управления очень малы (4 байта) для дополнительной гибкости, которую обеспечивает поддержка версий.

Если элемент управления не был создан с помощью мастера управления ActiveX, добавьте вызов COleControl::ExchangeVersion , вставив следующую строку в начале DoPropExchange функции (перед вызовом COleControl::DoPropExchange):

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
}

В качестве номера версии можно использовать любой DWORD . Проекты, созданные мастером управления ActiveX, используются _wVerMinor и _wVerMajor по умолчанию. Это глобальные константы, определенные в файле реализации класса управления ActiveX проекта. В оставшейся части DoPropExchange функции можно вызывать CPropExchange::GetVersion в любое время, чтобы получить сохраненную или извлекаемую версию.

В следующем примере для этого примера элемента управления версия 1 имеется только свойство ReleaseDate. Версия 2 добавляет свойство OriginalDate. Если элемент управления будет указан для загрузки постоянного состояния из старой версии, он инициализирует переменную-член для нового свойства значением по умолчанию.

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
   if (pPX->GetVersion() >= MAKELONG(0, 2))
   {
      PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
   }
   else
   {
      if (pPX->IsLoading())
         m_OriginalDate = 0;
   }
}

По умолчанию элемент управления преобразует старые данные в последний формат. Например, если версия 2 элемента управления загружает данные, сохраненные версией 1, он записывает формат версии 2 при повторном сохранении. Если вы хотите, чтобы элемент управления сохранял данные в формате последнего чтения, передайте false в качестве третьего параметра при вызове ExchangeVersion. Этот третий параметр является необязательным и по умолчанию имеет значение TRUE .

См. также

Элементы ActiveX библиотеки MFC