mfc列表控件的使用,MFC序列化

  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关联起来。

  通用属性页交换功能:

  组合框中选定的字符串和控件属性。所选字符串可以以与属性值相同的字母开头,但不必完全匹配。

  链接框中选定的字符串和控件属性。所选字符串可以以与属性值相同的字母开头,但不必完全匹配。

mfc列表控件的使用,MFC序列化