Otimizando persistência e inicialização
Por padrão, a persistência e a inicialização em um controle são tratadas pela função de membro de DoPropExchange . Em um controle típico, essa função contém as chamadas para várias funções de PX_ (PX_Color, PX_Font, e assim por diante), um para cada propriedade.
Esse método tem a vantagem de que uma única implementação de DoPropExchange pode ser usada para inicialização, para a persistência em formato binário, e para a persistência no formato também chamado de “-” catchall usado por qualquer contêiner. Essa função fornece todas as informações sobre as propriedades e seus valores padrão em um local conveniente.
No entanto, essa generalidade vem às custas da eficiência. As funções de PX_ obtém a flexibilidade com as implementações multicamadas que são inerentemente menos eficientes do que mais diretos, mas as abordagens menos flexíveis. Além disso, se um controle passa um valor padrão a uma função de PX_ , esse valor padrão deve ser fornecido o tempo todo, mesmo em situações quando o valor padrão não necessariamente ser usado. Se gerar o valor padrão é uma tarefa nontrivial (por exemplo, quando o valor é obtido de uma propriedade de ambiente), o acréscimo, trabalho desnecessário é feita nos casos em que o valor padrão não é usado.
Você pode melhorar o desempenho binário de persistência do controle substituindo a função de Serialize do controle. A implementação padrão dessa função de membro faz uma chamada à função de DoPropExchange . Substituindo a, você pode fornecer uma implementação mais direta para a persistência binário. Por exemplo, considere esta função de 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(""));
}
Para melhorar o desempenho de persistência binária deste controle, você pode substituir a função de Serialize como 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;
}
}
A variável local de dwVersion pode ser usado para detectar a versão do estado persistente de controle que está sendo carregada ou salvo. Você pode usar essa variável em vez de chamar CPropExchange::GetVersion.
Para salvar pouco espaço no formato persistente para uma propriedade de BOOL (e para manter compatíveis com o formato gerado por PX_Bool), você pode armazenar a propriedade como BYTE, como segue:
if (ar.IsLoading())
{
BYTE bTmp;
ar >> bTmp;
m_BoolProp = (BOOL)bTmp;
// other properties...
}
else
{
ar << (BYTE)m_BoolProp;
// other properties...
}
Observe que nos exemplos de carga, uma variável temporário é usado e seu valor é então atribuído, em vez de convertendo m_boolProp a uma referência de BYTE . A técnica de conversão resultaria em apenas um byte de m_boolProp que está sendo alterado, deixando os bytes restantes não inicializado.
Para o mesmo controle, você pode otimizar a inicialização de controle substituindo COleControl::OnResetState como segue:
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 sejam substituídos, a função de DoPropExchange deve ser mantida intacto porque ainda é usada para a persistência no formato do com conjunto. É importante manter todas essas três funções para assegurar que o controle gerencia suas propriedades forma consistente, independentemente do mecanismo de persistência o contêiner usa.