Оптимизировать сохраняемости и инициализация
По умолчанию сохраняемость и инициализация в элементе управления обрабатывается функцией-членом DoPropExchange.В стандартном элементе управления, эта функция содержит вызовы функций с несколькими PX_ (PX_Color, PX_Font и т д), по одному для каждого свойства.
Данный подход имеет то преимущество, что одну реализацию DoPropExchange может быть использован для инициализации для сохранения в бинарном формате и для сохранения в формате контейнера называемом «свойства», используемом некоторыми контейнерами.Эта одна функция предоставляет все сведения о свойствах и их значения по умолчанию в удобном месте.
Однако эта обычность поступает за показатель эффективности.Функции PX_ получающих гибкость до многослойные реализации, по существу менее эффективны, чем более гибкие напрямую, но менее, подходы.Кроме того, если элемент управления передает значение по умолчанию функции PX_, то значение по умолчанию должно быть предоставлено каждый раз, даже в тех случаях, когда значение по умолчанию не обязательно должен использоваться.Если формирование значение по умолчанию нетривиальная задача (например, когда значение получено из внешнего свойства), то дополнительного, ненужный исполнитель выполняется в тех случаях, когда значение по умолчанию не используется.
Можно улучшить производительность сохранения элемента управления бинарную путем переопределения функция Serialize элемента управления.Реализация по умолчанию данного функции-члена осуществляет вызовы функции DoPropExchange.Путем переопределения, можно предоставить более непосредственно реализацию бинарной сохраняемости.Например, рассмотрим следующую функцию DoPropExchange:
void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF,0x00,0x00));
PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}
Чтобы повысить производительность сохранения данного элемента управления бинарной можно переопределить функцию Serialize следующим образом:
void CMyAxOptCtrl::Serialize(CArchive& ar)
{
SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
SerializeExtent(ar);
SerializeStockProps(ar);
if (ar.IsLoading())
{
ar >> m_BoolProp;
ar >> m_ShortProp;
ar >> m_ColorProp;
ar >> m_StringProp;
}
else
{
ar << m_BoolProp;
ar << m_ShortProp;
ar << m_ColorProp;
ar << m_StringProp;
}
}
Локальную переменную dwVersion можно использовать для обнаружения версия сохраненного состояния элемента управления постоянного или нагружанной.Можно использовать эту переменную вместо вызова CPropExchange::GetVersion.
Чтобы сохранить меньшюю пространство в постоянном формате для свойства BOOL (и сохранить его совместимым с формат, созданный PX_Bool) можно хранить свойство как byte следующим образом:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Обратите внимание, что в грузовом контейнере, используется временная переменная, а затем значение, присвоенное m_boolProp, а не приводит к ссылке byte.Метод приведения привело бы к только в одном байте, дорабатыванным m_boolProp, а оставшиеся байты неинициализированным.
Для одного элемента управления, можно оптимизировать инициализация элемента управления путем переопределения COleControl::OnResetState следующим образом:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF,0x00,0x00);
m_StringProp.Empty();
}
Хотя Serialize и OnResetState были переопределены, функция DoPropExchange должна быть сохранена останутся неизменными, поскольку она по-прежнему используется для сохранения в формате контейнера свойств.Важно поддерживать все 3 из этих функций, чтобы убедиться, что элемент управления управляет его свойства согласованно, независимо от которых механизм сохраняемости используют контейнер.