Controlli ActiveX MFC: Serializzazione
In questo articolo viene illustrato come serializzare un controllo ActiveX.La serializzazione è il processo di lettura o scrittura di un supporto di un archivio permanente, ad esempio un file su disco.La libreria (MFC) MFC fornisce supporto incorporato della serializzazione nella classe CObject.COleControl estende il supporto dei controlli ActiveX con l'utilizzo di un meccanismo di scambio di proprietà.
La serializzazione dei controlli ActiveX viene implementata eseguendo l'override di COleControl::DoPropExchange.Questa funzione, denominata durante il caricamento e il salvataggio di controllo, archivia tutte le proprietà implementate con una variabile membro o una variabile membro con la notifica delle modifiche.
Negli argomenti riportati i passaggi principali relativi alla serializzazione di un controllo ActiveX:
Implementare funzione di DoPropExchangeper serializzare l'oggetto controllo
Personalizzare il processo di serializzazione
Implementare il supporto delle versioni
Implementare la funzione di DoPropExchange
Quando si utilizza la Creazione guidata controllo ActiveX per creare il progetto di controllo, molte funzioni di gestione predefinite vengono aggiunti automaticamente alla classe del controllo, inclusa l'implementazione predefinita di COleControl::DoPropExchange.Nell'esempio seguente viene illustrato il codice aggiunto alle classi create con la Creazione guidata controllo ActiveX:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
Per impostare una proprietà persistente, modificare DoPropExchange aggiungendo una chiamata alla funzione di scambio di proprietà.Il seguente esempio viene illustrata la serializzazione di una proprietà booleana personalizzata di CircleShape, in cui la proprietà di CircleShape ha un valore predefinito di TRUE:
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
Nella tabella seguente sono elencate le funzioni in termini di scambio di proprietà è possibile utilizzare per serializzare le proprietà del controllo:
Funzioni di scambio di proprietà |
Scopo |
---|---|
PX_Blob () |
Serializza una proprietà di dati (BLOB) dell'oggetto binario di grandi dimensioni del tipo. |
PX_Bool () |
Serializza una proprietà booleana del tipo. |
PX_Color () |
Serializza una proprietà di colore del tipo. |
PX_Currency () |
Serializza una proprietà di CY del tipo (valuta. |
PX_Double () |
Serializza una proprietà di double del tipo. |
PX_Font () |
Serializza una proprietà del tipo di carattere. |
PX_Float () |
Serializza una proprietà di float del tipo. |
PX_IUnknown () |
Serializza una proprietà di tipo LPUNKNOWN. |
PX_Long () |
Serializza una proprietà di long del tipo. |
PX_Picture () |
Serializza una proprietà di un'immagine del tipo. |
PX_Short () |
Serializza una proprietà di short del tipo. |
PX_String () |
Serializza una proprietà di CString del tipo. |
PX_ULong () |
Serializza una proprietà di ULONG del tipo. |
PX_UShort () |
Serializza una proprietà di USHORT del tipo. |
Per ulteriori informazioni su queste funzioni di scambio di proprietà, vedere Persistenza dei controlli OLEin riferimenti alla libreria MFC.
Personalizzare il comportamento predefinito di DoPropExchange
L'implementazione predefinita di DoPropertyExchange (come illustrato nell'argomento precedente) effettua una chiamata a classe base COleControl.Ciò serializza un insieme di proprietà automaticamente supportate da COleControl, che utilizza più spazio di memoria che la serializzazione solo le proprietà personalizzate del controllo.Rimuovere questa chiamata consente all'oggetto serializzi solo le proprietà considerate importante.Qualsiasi proprietà predefinita indica il controllo ha implementato non verrà serializzata quando si salva o caricando l'oggetto controllo a meno che in modo esplicito aggiungere le richieste di PX_ essi.
Implementare il supporto delle versioni
Il supporto delle versioni consente a un controllo ActiveX rivisto per aggiungere nuove proprietà persistenti e tuttavia possibile individuare e caricare lo stato persistente creato in una versione precedente del controllo.Per rendere disponibile la versione di un controllo come parte dei dati persistenti, chiamata COleControl::ExchangeVersion nella funzione di DoPropExchange del controllo.Questa chiamata viene automaticamente inserita se il controllo ActiveX è stato creato mediante la Creazione guidata controllo ActiveX.Può essere rimossa se il supporto delle versioni non è necessario.Tuttavia, il costo delle dimensioni del controllo è molto breve (4 byte) per la flessibilità aggiunta del supporto delle versioni di.
Se il controllo non è stato creato con la Creazione guidata controllo ActiveX, aggiungere una chiamata a COleControl::ExchangeVersion inserendo la riga seguente all'inizio della funzione di DoPropExchange (prima della chiamata a COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
È possibile utilizzare qualsiasi DWORD come numero di versione.Progetti generati tramite l'utilizzo _wVerMinor e _wVerMajor della Creazione guidata controllo ActiveX come predefinito.Queste sono costanti globali definiti nel file di implementazione della classe del controllo ActiveX del progetto.Nel resto della funzione di DoPropExchange , è possibile chiamare CPropExchange::GetVersion in qualsiasi momento per recuperare la versione che si sta salvando o che recuperano.
Nell'esempio seguente, la versione 1 del controllo di esempio contiene una singola proprietà “di ReleaseDate„.La versione 2 viene aggiunta una proprietà “di OriginalDate„.Se il controllo è responsabile per caricare lo stato persistente dalla versione precedente, inizializza la variabile membro per la nuova proprietà su un valore predefinito.
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;
}
...
}
Per impostazione predefinita, un controllo “conversione„ i dati non aggiornati all'ultimo formato.Ad esempio, se la versione 2 di un controllo carica i dati salvati dalla versione 1, scriverà il formato della versione 2 quando viene salvato ancora.Se si desidera che il controllo per salvare i dati in formato lettura per ultimo, passare FALSE come terzo parametro quando si chiama ExchangeVersion.Il terzo parametro è facoltativo e viene TRUE per impostazione predefinita.