DoPropExchange,版本號為任何 DWORD ,成員變數初始化,持久性。
基本介紹
- 中文名:DoPropExchange
- 版本號:任何 DWORD
- 屬性:持久性
- 默認值:成員變數初始化
簡介,其他,
簡介
以下是MSDN中的對於DoPropExchange函式的介紹:
virtual void DoPropExchange( CPropExchange* pPX );
Parameters
pPX
A pointer to a CPropExchange object. The framework supplies this object to establish the context of the property exchange, including its direction.
Remarks
Called by the framework when loading or storing a control from a persistent storage representation, such as a stream or property set. This function normally makes calls to the PX_ family of functions to load or store specific user-defined properties of an OLE control.
If Control Wizard has been used to create the OLE control project, the overridden version of this function will serialize the stock properties supported by COleControl with a call to the base class function, COleControl::DoPropExchange. As you add user-defined properties to your OLE control you will need to modify this function to serialize your new properties. For more information on serialization, see the articleActiveX Controls: Serializing in Visual C++ Programmer’s Guide
實現DoPropExchange 函式
當使用“ActiveX 控制項嚮導”生成控制項項目時,幾個默認處理函式被自動添加到控制項類,包括 COleControl::DoPropExchange 的默認實現。下例顯示添加到用“ActiveX 控制項嚮導”創建的類的代碼:
void CSampleCtrl::DoPropExchange( CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
// TODO: Call PX_ functions for each persistent custom property.
}
如果要使屬性持久,則通過添加對屬性交換函式的調用來修改 DoPropExchange。下例說明自定義布爾 CircleShape 屬性的序列化,這裡 CircleShape 屬性的默認值為 TRUE:
void CSampleCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Bool(pPX, "CircleShape", m_bCircleShape, TRUE);
}
下表列出了可用於序列化控制項屬性的可能的屬性交換函式:
屬性交換函式 目的
PX_Blob( ) 序列化二進制大對象 (BLOB) 類型數據屬性。
PX_Bool( ) 序列化布爾類型屬性。
PX_Color( ) 序列化顏色類型屬性。
PX_Currency( ) 序列化 CY(貨幣)類型屬性。
PX_Double( ) 序列化 double 類型屬性。
PX_Font( ) 序列化 Font 類型屬性。
PX_Float( ) 序列化 float 類型屬性。
PX_IUnknown( ) 序列化 LPUNKNOWN 類型屬性。
PX_Long( ) 序列化 long 類型屬性。
PX_Picture( ) 序列化 Picture 類型屬性。
PX_Short( ) 序列化 short 類型屬性。
PX_String( ) 序列化 CString 類型屬性。
PX_ULong( ) 序列化 ULONG 類型屬性。
PX_UShort( ) 序列化 USHORT 類型屬性。
有關這些屬性交換函式的更多信息,請參見“MFC 參考”中的 OLE 控制項的持久性。
其他
自定義 DoPropExchange 的默認行為
DoPropertyExchange 的默認實現(如上一主題所示)調用 COleControl 基類。此操作序列化 COleControl 自動支持的屬性集,所使用的存儲空間比只序列化控制項的自定義屬性多。移除此調用使您的對象得以只序列化您認為重要的那些屬性。保存或載入控制項對象時,除非對控制項已實現的任何常用屬性狀態顯式添加 PX_ 調用,否則將不會序列化它們。
實現版本支持
版本支持使修訂過的 ActiveX 控制項得以添加新的持久性屬性,並仍可以檢測和載入由早期版本的控制項創建的持久性狀態。若要使控制項的版本可用作其持久性數據的一部分,請在控制項的 DoPropExchange 函式中調用 COleControl::ExchangeVersion。如果 ActiveX 控制項是用“ActiveX 控制項嚮導”創建的,則將自動插入此調用。如果不需要版本支持,可移除此調用。但是,控制項大小的成本對於版本支持所提供的額外靈活性非常小(4 個位元組)。
如果控制項不是用“ActiveX 控制項嚮導”創建的,則通過在 DoPropExchange 函式的開始處(在調用 COleControl::DoPropExchange 之前)插入下行來添加對 COleControl::ExchangeVersion 的調用:
void CSampleCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
可以使用任何 DWORD 作為版本號。“ActiveX 控制項嚮導”所生成的項目使用 _wVerMinor 和 _wVerMajor 作為默認值。_wVerMinor 和 _wVerMajor 是在項目的 ActiveX 控制項類的實現檔案中定義的全局常數。在 DoPropExchange 函式的其餘部分,可以隨時調用 CPropExchange::GetVersion 檢索正在保存或檢索的版本。
在下例中,此示例控制項的版本 1 僅有“ReleaseDate”屬性。版本 2 添加了“OriginalDate”屬性。如果指示控制項從舊版本載入持久性狀態,則控制項將新屬性的成員變數初始化為默認值。
void CSampleCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
PX_Long(pPX, "ReleaseDate", m_releaseDate);
if (pPX->GetVersion() >= MAKELONG(0, 2))
{
PX_Long(pPX, "OriginalDate", m_originalDate);
}
else
{
if (pPX->IsLoading())
m_originalDate = 0;
}
}
默認情況下,控制項將舊數據“轉換”成最新格式。例如,如果控制項的版本 2 載入由版本 1 保存的數據,則數據再次保存時將寫成版本 2 的格式。如果希望控制項以上次讀取的格式保存數據,則在調用 ExchangeVersion 時將 FALSE 作為第三個參數傳遞。此第三個參數是可選的,默認值為 TRUE。