Otimização de persistência e inicialização
Por padrão, persistência e a inicialização em um controle são manipulados pelo DoPropExchange função de membro. Em um controle típico, essa função contém chamadas para diversas PX_ funções de PX_Color, PX_Fonte assim por diante), um para cada propriedade.
Essa abordagem tem a vantagem que um único DoPropExchangeimplementação pode ser usada para a inicialização, persistência em formato binário e persistência no formato conjunto-chamados"Propriedades" usado por alguns recipientes. Essa uma função fornece todas as informações sobre as propriedades e seus valores padrão em um único local conveniente.
Entretanto, esta generalidade vem à custa de eficiência.The PX_ funções obtém sua flexibilidade por meio de implementações de várias camadas que são inerentemente menos eficiente do que as abordagens mais diretas, mas menos flexíveis.Além disso, se um controle passar um valor padrão para um PX_ função, esse valor padrão deve ser fornecido cada time, mesmo em situações quando o valor padrão não pode ser usado necessariamente.Se a geração de valor padrão é uma tarefa não trivial (por exemplo, quando o valor é obtido de uma propriedade de ambiente) e, em seguida, extra, trabalho desnecessário será concluído em casos onde o valor padrão não é usado.
Você pode melhorar o desempenho de persistência binário do controle, substituindo Serialize função. A implementação padrão desta função de membro faz uma telefonar para o seu DoPropExchange função. Substituindo-lo, você pode fornecer uma implementação mais direta para persistência binária.Por exemplo, considere esta DoPropExchange função:
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(""));
}
Para melhorar o desempenho de persistência binário desse controle, você pode substituir o Serialize função sistema autônomo segue:
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;
}
}
The dwVersion variável local pode ser usada para detectar a versão do estado persistente do controle que está sendo carregado ou salvo. Você pode usar essa variável em vez de chamar CPropExchange::GetVersion.
Para salvar um pouco de espaço do formato persistente para um BOOL propriedade (e para mantê-lo compatível com o formato produzido por PX_Bool), você pode armazenar a propriedade sistema autônomo um BYTE, da seguinte maneira:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Observe que, no caso de carga, uma variável temporária é usada e, em seguida, seu valor é atribuído, em vez de elenco m_boolProp para um BYTE referência.A técnica de elenco resultaria em apenas um byte de m_boolProp que está sendo modificado, deixar os bytes remanescentes não inicializado.
Para o mesmo controle, você pode otimizar a inicialização do controle, substituindo COleControl::OnResetState da seguinte maneira:
void CMyAxOptCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();
m_BoolProp = TRUE;
m_ShortProp = 0;
m_ColorProp = RGB(0xFF,0x00,0x00);
m_StringProp.Empty();
}
Embora Serialize e OnResetState tiver sido substituído, o DoPropExchange função deve ser mantida intacta porque ainda é usado para persistência no formato do conjunto de propriedades. É importante manter todos os três essas funções para garantir que o controle gerencia suas propriedades de forma consistente, independentemente de qual persistência no contêiner do mecanismo usa.