优化持久性和初始化

默认情况下,保持和初始化该控件由 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

若要节省中持久格式的 ACE 空间 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();
}

尽管 SerializeOnResetState 重写,应保持完整 DoPropExchange 函数,因为为仍然使用持久性。属性包格式。 维护所有三这些函数必须确保控件的一致地管理其属性,保持机制容器使用。

请参见

概念

MFC ActiveX 控件:优化