词条 | DoPropExchange |
释义 | 以下是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。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。