优化持久性和初始化

默认情况下,持久性和初始化控件由 DoPropExchange 成员函数处理。 在典型的控件时,此函数包含对多 PX_ 功能 (PX_ColorPX_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();
}

虽然 SerializeOnResetState 已被重写时,应保持 DoPropExchange 功能已完成,因为它为持久性仍使用属性包格式。 维护所有这三个功能请务必的控件一致地管理其属性,保持机制容器使用。

请参见

概念

MFC ActiveX 控件:优化