mfc列表控件的使用,MFC序列化
本文讨论了序列化ActiveX控件的方法。序列化是从持久性存储介质(如磁盘文件)中读取或向其写入的过程。Microsoft基础类库(MFC)为CObject类中的序列化提供了内置支持。COleControl通过使用属性交换机制将这种支持扩展到ActiveX控件。
ActiveX控件的序列化是通过重写cole control:doproexchange实现的。在加载和保存控件对象期间调用该函数,以存储用成员变量或带有更改通知的成员变量实现的所有属性。用户可以序列化控件以记录控件的状态。
下列主题描述了与序列化ActiveX控件相关的主要问题:
实现DoPropExchange函数来序列化控件对象。定制序列化流程以实现版本支持
实现DoPropExchange函数
当使用ActiveX控件向导生成控件项目时,几个默认处理函数会自动添加到控件类中,包括cole Control:doproexchange的默认实现。下面的示例显示了添加到用ActiveX控件向导创建的类中的代码:
void CSampleCtrl:doproexchange(CPropExchange * pPX)
ExchangeVersion(pPX,MAKELONG(_wVerMinor,_ wVerMajor));
cole control:doproexchange(pPX);
//TODO:为每个持久性自定义属性调用PX_ functions。
}
如果要保持该属性,请通过添加对属性交换函数的调用来修改DoPropExchange。下列范例说明自订布林CircleShape属性的序列化,其中CircleShape属性的预设值为TRUE:
void CSampleCtrl:doproexchange(CPropExchange * pPX)
ExchangeVersion(pPX,MAKELONG(_wVerMinor,_ wVerMajor));
cole control:doproexchange(pPX);
PX_Bool(pPX, CircleShape ,m_bCircleShape,TRUE);
}PX_Bool(pPX, CircleShape ,m_bCircleShape,TRUE);
第一个参数:指向CPropExchange类型变量的指针;第二个参数:属性名;第三个参数:对应的成员变量;第四个参数:默认值;可选参数。
下表列出了可用于序列化控件属性的可能的属性交换函数:
序列化USHORT类型属性。
有关这些属性交换函数的更多信息,请参见MFC参考中的OLE控件的持久性。
自定义DoPropExchange的默认行为
DoPropertyExchange的默认实现(如前一主题所示)调用COleControl基类。此操作序列化COleControl自动支持的属性集,这比仅序列化控件的自定义属性使用更多的存储空间。移除此调用使您的对象能够只序列化那些您认为重要的属性。保存或加载控件对象时,除非将PX_ call显式添加到控件已实现的任何公共属性状态,否则它们不会被序列化。
实现版本支持
版本支持使修订后的ActiveX控件能够添加新的持久属性,并且仍然可以检测和加载由控件的早期版本创建的持久状态。若要使控件的版本作为其持久数据的一部分可用,请在控件的DoPropExchange函数中调用COleControl:ExchangeVersion。如果ActiveX控件是用ActiveX控件向导创建的,将自动插入该调用。如果不需要版本支持,可以删除此调用。但是,对于版本支持提供的额外灵活性来说,控件大小的成本非常小(4个字节)。
如果该控件不是用ActiveX控件向导创建的,请通过在doproexchange函数的开头插入以下行来添加对COleControl:ExchangeVersion的调用(在调用cole Control:doproexchange之前):
void CSampleCtrl:doproexchange(CPropExchange * pPX)
ExchangeVersion(pPX,MAKELONG(_wVerMinor,_ wVerMajor));
cole control:doproexchange(pPX);
}
您可以使用任何DWORD作为版本号。ActiveX控件向导生成的项目使用_wVerMinor和_ wVermmajoras默认值。_wVerMinor和_ wVermmajorare是在项目的ActiveX控件类的实现文件中定义的全局常量。在DoPropExchange函数的其余部分,可以随时调用CPropExchange:GetVersion来检索正在保存或检索的版本。
在下面的示例中,此示例控件的版本1只有“ReleaseDate”属性。版本2增加了“OriginalDate”属性。如果指示控件从旧版本加载持久状态,控件会将新属性的成员变量初始化为默认值。
void CSampleCtrl:doproexchange(CPropExchange * pPX)
ExchangeVersion(pPX,MAKELONG(_wVerMinor,_ wVerMajor));
cole control:doproexchange(pPX);
PX_Long(pPX, ReleaseDate ,m _ release date);
if (pPX- GetVersion()=MAKELONG(0,2))
PX_Long(pPX, OriginalDate ,m _ original date);
if (pPX- IsLoading())
m _ original date=0;
}
默认情况下,控件将旧数据“转换”为最新格式。例如,如果控件的版本2加载由版本1保存的数据,当再次保存时,数据将以版本2的格式写入。如果希望控件以上次读取的格式保存数据,请在调用ExchangeVersion时将FALSE作为第三个参数传递。第三个参数是可选的,默认值为TRUE。
另:属性页交换功能
属性页上的控件变量与ActiveX控件的属性相关联。使用了DDP_ function。
例如DDP_Text(pDX,IDC_CODE,m_code,_ T( CodeString ));就是把m_code和属性CodeString关联起来。
通用属性页交换功能:
组合框中选定的字符串和控件属性。所选字符串可以以与属性值相同的字母开头,但不必完全匹配。
链接框中选定的字符串和控件属性。所选字符串可以以与属性值相同的字母开头,但不必完全匹配。