Contrôles ActiveX MFC : sérialisation
Cet article explique comment sérialiser un contrôle ActiveX. La sérialisation est le processus de lecture ou d’écriture dans un support de stockage persistant, tel qu’un fichier disque. La bibliothèque MFC (Microsoft Foundation Class) fournit une prise en charge intégrée de la sérialisation dans la classe CObject
. COleControl
étend cette prise en charge aux contrôles ActiveX via l’utilisation d’un mécanisme d’échange de propriétés.
Important
ActiveX est une technologie héritée qui ne doit pas être utilisée pour le nouveau développement. Pour plus d’informations sur les technologies modernes qui remplacent ActiveX, consultez Contrôles ActiveX.
La sérialisation pour les contrôles ActiveX est implémentée en remplaçant COleControl ::D oPropExchange. Cette fonction, appelée pendant le chargement et l’enregistrement de l’objet de contrôle, stocke toutes les propriétés implémentées avec une variable membre ou une variable membre avec notification de modification.
Les rubriques suivantes couvrent les principaux problèmes liés à la sérialisation d’un contrôle ActiveX :
Implémentation de
DoPropExchange
la fonction pour sérialiser votre objet de contrôle
Implémentation de la fonction DoPropExchange
Lorsque vous utilisez l’Assistant Contrôle ActiveX pour générer le projet de contrôle, plusieurs fonctions de gestionnaire par défaut sont automatiquement ajoutées à la classe de contrôle, y compris l’implémentation par défaut de COleControl ::D oPropExchange. L’exemple suivant montre le code ajouté aux classes créées avec l’Assistant Contrôle ActiveX :
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
Si vous souhaitez rendre une propriété persistante, modifiez-la DoPropExchange
en ajoutant un appel à la fonction d’échange de propriétés. L’exemple suivant illustre la sérialisation d’une propriété CircleShape booléenne personnalisée, où la propriété CircleShape a la valeur par défaut TRUE :
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
Le tableau suivant répertorie les fonctions d’échange de propriétés possibles que vous pouvez utiliser pour sérialiser les propriétés du contrôle :
Fonctions d’échange de propriétés | Objectif |
---|---|
PX_Blob( ) | Sérialise une propriété de données blob (Binary Large Object) de type. |
PX_Bool( ) | Sérialise une propriété booléenne de type. |
PX_Color( ) | Sérialise une propriété de couleur de type. |
PX_Currency( ) | Sérialise une propriété CY de type (devise). |
PX_Double( ) | Sérialise une propriété de type double . |
PX_Font( ) | Sérialise une propriété de type police. |
PX_Float( ) | Sérialise une propriété de type float . |
PX_IUnknown( ) | Sérialise une propriété de type LPUNKNOWN . |
PX_Long( ) | Sérialise une propriété de type long . |
PX_Picture( ) | Sérialise une propriété Picture de type. |
PX_Short( ) | Sérialise une propriété de type short . |
PXstring( ) | Sérialise une propriété de type CString . |
PX_ULong( ) | Sérialise une propriété ULONG de type. |
PX_UShort( ) | Sérialise une propriété USHORT de type. |
Pour plus d’informations sur ces fonctions d’échange de propriétés, consultez Persistance des contrôles OLE dans la référence MFC.
Personnalisation du comportement par défaut de DoPropExchange
L’implémentation par défaut de DoPropertyExchange
(comme indiqué dans la rubrique précédente) effectue un appel à la classe COleControl
de base. Cela sérialise l’ensemble de propriétés automatiquement pris en charge par COleControl
, qui utilise plus d’espace de stockage que la sérialisation uniquement les propriétés personnalisées du contrôle. La suppression de cet appel permet à votre objet de sérialiser uniquement les propriétés que vous considérez comme importantes. Toute propriété stock indique que le contrôle n’est pas sérialisé lors de l’enregistrement ou du chargement de l’objet de contrôle, sauf si vous ajoutez explicitement PX_ appels pour eux.
Implémentation de la prise en charge de la version
La prise en charge des versions permet à un contrôle ActiveX révisé d’ajouter de nouvelles propriétés persistantes et de pouvoir détecter et charger l’état persistant créé par une version antérieure du contrôle. Pour rendre la version d’un contrôle disponible dans le cadre de ses données persistantes, appelez COleControl ::ExchangeVersion dans la fonction du DoPropExchange
contrôle. Cet appel est automatiquement inséré si le contrôle ActiveX a été créé à l’aide de l’Assistant Contrôle ActiveX. Elle peut être supprimée si la prise en charge de la version n’est pas nécessaire. Toutefois, le coût en taille de contrôle est très petit (4 octets) pour la flexibilité supplémentaire que fournit la prise en charge de la version.
Si le contrôle n’a pas été créé avec l’Assistant Contrôle ActiveX, ajoutez un appel en COleControl::ExchangeVersion
insérant la ligne suivante au début de votre DoPropExchange
fonction (avant l’appel à COleControl::DoPropExchange
) :
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
}
Vous pouvez utiliser n’importe quel DWORD comme numéro de version. Les projets générés par l’Assistant Contrôle ActiveX utilisent _wVerMinor
et _wVerMajor
comme valeur par défaut. Il s’agit de constantes globales définies dans le fichier d’implémentation de la classe de contrôle ActiveX du projet. Dans le reste de votre DoPropExchange
fonction, vous pouvez appeler CPropExchange ::GetVersion à tout moment pour récupérer la version que vous enregistrez ou récupérez.
Dans l’exemple suivant, la version 1 de cet exemple de contrôle n’a qu’une propriété « ReleaseDate ». La version 2 ajoute une propriété « OriginalDate ». Si le contrôle est invité à charger l’état persistant à partir de l’ancienne version, il initialise la variable membre pour la nouvelle propriété sur une valeur par défaut.
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
}
else
{
if (pPX->IsLoading())
m_OriginalDate = 0;
}
}
Par défaut, un contrôle « convertit » les anciennes données au format le plus récent. Par exemple, si la version 2 d’un contrôle charge les données enregistrées par la version 1, elle écrit le format version 2 lorsqu’il est enregistré à nouveau. Si vous souhaitez que le contrôle enregistre les données au format dernière lecture, passez FALSE en tant que troisième paramètre lors de l’appel ExchangeVersion
. Ce troisième paramètre est facultatif et a la valeur TRUE par défaut.