IMPLEMENT_SERIAL(CTree,CObject,0)各参数是何意思??? ??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用于支持序列化的宏推荐查看《深入浅出MFC》第三章上面有详细的描述 第3章 MFC 六大關鍵技術之模擬167DECLARE_SERIAL / IMPLEMENT_SERIAL 巨集要將 << 和 >> 兩個運算子多載化,還要讓 Serialize 函式神不知鬼不覺㆞放入類別宣告之㆗,最好的作法仍然是使用巨集。類別之能夠進行檔案讀寫動作,前提是擁有動態生成的能力,所以,MFC 設計了兩個巨集DECLARE_SERIAL 和 IMPLEMENT_SERIAL:#define DECLARE_SERIAL(class_name) \DECLARE_DYNCREATE(class_name) \friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \CObject* PASCAL class_name::CreateObject() \{ return new class_name; } \_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \class_name::CreateObject) \CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \return ar; } \為了在每㆒個物件被處理(讀或寫)之前,能夠處理瑣屑的工作,諸如判斷是否第㆒次出現、記錄版本號碼、記錄檔名等工作,CRuntimeClass 需要兩個函式 Load 和 Store:struct CRuntimeClass{// AttributesLPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema; // schema number of the loaded classCObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract classCRuntimeClass* m_pBaseClass;CObject* CreateObject();void Store(CArchive& ar) const;static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);// CRuntimeClass objects linked together in simple liststatic CRuntimeClass* pFirstClass; // start of class listCRuntimeClass* m_pNextClass; // linked list of registered classes}; 在处理List control 中选中行 自动跳到下一行。。 为何我点击exit 窗体不退出?真心求(附2段代码 Scroll Bar的动作都有哪些值? 在VC++中已经建立了一个工程,现在想修改工程的名字应如何改? VC++初学者的疑惑 如何判断异步connect连接成功? 示波器的制作!!!相关资料!!!谢谢200分. 怎么才能让我的dialogbar没有右上角的那个用于hide的‘叉’ 请问,打开一个这样的“打开文件对话框”如何实现? 怎样写二进制文件 DIALOG能做全屏幕吗? CRectTracker橡皮盤類初級問題!送分
167
DECLARE_SERIAL / IMPLEMENT_SERIAL 巨集要將 << 和 >> 兩個運算子多載化,還要讓 Serialize 函式神不知鬼不覺㆞放入類別宣告
之㆗,最好的作法仍然是使用巨集。
類別之能夠進行檔案讀寫動作,前提是擁有動態生成的能力,所以,MFC 設計了兩個巨
集DECLARE_SERIAL 和 IMPLEMENT_SERIAL:
#define DECLARE_SERIAL(class_name) \
DECLARE_DYNCREATE(class_name) \
friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject) \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; } \
為了在每㆒個物件被處理(讀或寫)之前,能夠處理瑣屑的工作,諸如判斷是否第㆒次
出現、記錄版本號碼、記錄檔名等工作,CRuntimeClass 需要兩個函式 Load 和 Store:
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
CObject* CreateObject();
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};