Partager via


optimiser la persistance et l'initialisation

Par défaut, la persistance et l'initialisation d'un contrôle sont gérés par la fonction membre d'DoPropExchange. Dans un contrôle type, cette fonction contient les appels à plusieurs fonctions de PX_ (PX_Color, PX_Font, etc.), un pour chaque propriété.

Cette solution présente l'avantage qu'une seule implémentation d'DoPropExchange peut être utilisée pour l'initialisation, pour la persistance au format binaire, et pour la persistance du soi-disant format « conteneur des propriétés » utilisé par certains conteneurs. Cette fonction fournit toutes les informations sur les propriétés et leurs valeurs par défaut dans une fonction pratique.

Toutefois, cette généralité provient au détriment de l'efficacité. Les fonctions de PX_ reçoivent leur souplesse via des implémentations multicouche en conséquence moins efficaces que plus direct, mais moins souples, les approches. En outre, si le contrôle est passé comme valeur par défaut une fonction de PX_, cette valeur par défaut doit être fournie chaque fois, même dans les situations où la valeur par défaut ne peut pas nécessairement être utilisée. Si la valeur par défaut est une tâche triviale (par exemple, si la valeur est obtenue à partir de propriété ambiante), les du travail non nécessaire est effectuée dans les cas où la valeur par défaut n'est pas utilisée.

Vous pouvez améliorer la représentation binaire de la persistance de votre contrôle en entrant la fonction d'Serialize de votre contrôle. L'implémentation par défaut de cette fonction membre passe un appel à la fonction d'DoPropExchange. En la remplaçant, vous pouvez fournir une implémentation plus directe pour la persistance binaire. Par exemple, observez cette déclaration : 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(""));
}

Pour améliorer les performances de la persistance binaire de ce contrôle, vous pouvez remplacer la fonction d'Serialize comme suit :

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;
    }
}

La variable locale d'dwVersion permet de détecter la version de l'état permanent du contrôle chargé ou enregistré. Vous pouvez utiliser cette variable au lieu d'appeler CPropExchange::GetVersion.

Pour enregistrer un petit espace au format permanent pour une propriété de BOOL (et de la gestion compatible avec le format produit par PX_Bool), vous pouvez stocker la propriété définie BYTE, comme suit :

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

Notez que dans le cas de charge, une variable temporaire est utilisé et que sa valeur est affectée, plutôt qu' m_boolProp de conversion vers une référence de BYTE. La technique de conversion provoquerait un seul octet d'm_boolProp modifié, laissant les octets restants non initialisés.

Pour le même contrôle, vous pouvez optimiser l'initialisation du contrôle en remplaçant COleControl::OnResetState comme suit :

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF,0x00,0x00);
   m_StringProp.Empty();
}

Bien qu' Serialize et OnResetState ont été substitués, la fonction d'DoPropExchange doit être conservée intacte parce qu'elle est encore utilisée pour la persistance du format de conteneur des propriétés. Il est important de conserver les trois de ces fonctions pour vous assurer que le contrôle gère ses propriétés régulièrement, indépendamment de le mécanisme de persistance le conteneur utilise.

Voir aussi

Concepts

Contrôles ActiveX MFC : optimisation