优化持久性和初始化
默认情况下,持久性和初始化控件由 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生成的格式兼容),可以存储属性作为 字节,如下所示:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
请注意在加载用例,临时变量使用其值然后分配,而不是转换的 m_boolProp 到 字节 引用。 铸造过程只会生成修改的一个字节 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 功能已完成,因为它为持久性仍使用属性包格式。 维护所有这三个功能请务必的控件一致地管理其属性,保持机制容器使用。