MFC ActiveX 控制項:序列化
本文討論如何序列化 ActiveX 控制項。 序列化是讀取或寫入永續性儲存媒體的程式,例如磁片檔案。 Microsoft Foundation Class (MFC) 程式庫提供類別 中 CObject
序列化的內建支援。 COleControl
透過使用屬性交換器制,將此支援延伸至 ActiveX 控制項。
重要
ActiveX 是不應該用於新開發的舊版技術。 如需取代 ActiveX 的新式技術詳細資訊,請參閱 ActiveX 控制項 。
ActiveX 控制項的序列化是透過覆寫 COleControl::D oPropExchange 來實作。 此函式會在載入和儲存控制項物件期間呼叫,會儲存使用成員變數實作的所有屬性,或是含有變更通知的成員變數。
下列主題涵蓋與序列化 ActiveX 控制項相關的主要問題:
實作 DoPropExchange 函式
當您使用 ActiveX 控制項精靈產生控制項專案時,會自動將數個預設處理常式函式新增至控制項類別,包括 COleControl::D oPropExchange 的預設實作 。 下列範例顯示新增至使用 ActiveX 控制項精靈建立之類別的程式碼:
void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
如果您想要讓屬性持續運作,請藉由新增對屬性交換函式的呼叫來修改 DoPropExchange
。 下列範例示範自訂 Boolean CircleShape 屬性的序列化,其中 CircleShape 屬性的預設值為 TRUE :
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}
下表列出可用來序列化控制項屬性的可能屬性交換函式:
屬性交換函式 | 目的 |
---|---|
PX_Blob( ) | 序列化二進位大型物件 (BLOB) 資料屬性類型。 |
PX_Bool( ) | 序列化布林值型別屬性。 |
PX_Color( ) | 序列化類型色彩屬性。 |
PX_Currency( ) | 序列化類型 CY (currency) 屬性。 |
PX_Double( ) | 序列化類型 double 屬性。 |
PX_Font( ) | 序列化 Font 類型屬性。 |
PX_Float( ) | 序列化類型 float 屬性。 |
PX_IUnknown( ) | 序列化 類型的 LPUNKNOWN 屬性。 |
PX_Long( ) | 序列化類型 long 屬性。 |
PX_Picture( ) | 序列化 Picture 屬性類型。 |
PX_Short( ) | 序列化類型 short 屬性。 |
PXstring( ) | 序列化類型 CString 屬性。 |
PX_ULong( ) | 序列化類型 ULONG 屬性。 |
PX_UShort( ) | 序列化 USHORT 屬性類型 。 |
如需這些屬性交換函式的詳細資訊,請參閱 MFC 參考 中的 OLE 控制項 持續性。
自訂 DoPropExchange 的預設行為
的預設實 DoPropertyExchange
作 (如上一個主題所示) 會呼叫基類 COleControl
。 這會自動序列化 所 COleControl
支援的屬性集,這個屬性會使用比只序列化 控制項的自訂屬性更多的儲存空間。 移除此呼叫可讓您的物件只序列化您考慮的重要屬性。 儲存或載入控制項物件時,不會序列化控制項實作的任何庫存屬性,除非您明確新增 PX_ 呼叫控制項。
實作版本支援
版本支援可讓修訂的 ActiveX 控制項加入新的永續性屬性,而且仍然可以偵測及載入舊版控制項所建立的持續性狀態。 若要讓控制項的版本成為其永續性資料的一部分,請在控制項的 DoPropExchange
函式中呼叫 COleControl::ExchangeVersion 。 如果使用 ActiveX 控制項精靈建立 ActiveX 控制項,則會自動插入此呼叫。 如果不需要版本支援,則可以將其移除。 不過,對於版本支援所提供的額外彈性,控制大小的成本非常小(4 個位元組)。
如果未使用 ActiveX 控制項精靈建立控制項,請在函 DoPropExchange
式開頭插入下列程式程式碼來新增 呼叫 COleControl::ExchangeVersion
(在 呼叫 COleControl::DoPropExchange
之前):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
}
您可以使用任何 DWORD 作為版本號碼。 ActiveX 控制項精靈所產生的專案會使用 _wVerMinor
和 _wVerMajor
作為預設值。 這些是專案 ActiveX 控制項類別實作檔中定義的全域常數。 在函 DoPropExchange
式的其餘部分內,您可以隨時呼叫 CPropExchange::GetVersion 來擷取您要儲存或擷取的版本。
在下列範例中,此範例控制項的第 1 版只有 「ReleaseDate」 屬性。 第 2 版會新增 「OriginalDate」 屬性。 如果指示控制項從舊版載入持續性狀態,它會將新屬性的成員變數初始化為預設值。
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;
}
}
根據預設,控制項會將舊資料「轉換成最新的格式」。 例如,如果控制項第 2 版載入第 1 版所儲存的資料,則會在再次儲存時寫入第 2 版格式。 如果您想要讓控制項以上次讀取的格式儲存資料,請在呼叫 ExchangeVersion
時傳遞 FALSE 做為第三個參數。 第三個參數是選擇性的,預設為 TRUE 。