深入浅出MFC第2版(PDF格式)-第106部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
。。。
}
。。。
return pClassRef;
}
519
C
…………………………………………………………Page 582……………………………………………………………
第篇 深入 MFC 程式設計
CRuntimeClass* PASCAL CRuntimeClass::Load(CArchive& ar;
B
UINT* pwSchemaNum) // loads a runtime class description
{
WORD nLen;
char szClassName'64';
CRuntimeClass* pClass;
本例读入 0001
WORD wTemp;
ar 》》 wTemp;
*pwSchemaNum = wTemp;
本例读入 0007
ar 》》 nLen;
本例读入 “CStroke”
if (nLen 》= _countof(szClassName) ||
ar。Read(szClassName; nLen*sizeof(char)) != nLen*sizeof(char))
{
return NULL;
}
szClassName'nLen' = '0';
// search app specific classes
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
AfxLockGlobals(CRIT_RUNTIMECLASSLIST);
for (pClass = pModuleState…》m_classList; pClass != NULL;
pClass = pClass…》m_pNextClass)
{
if (lstrcmpA(szClassName; pClass…》m_lpszClassName) == 0)
{
检验整个
AfxUnlockGlobals (CRIT_RUNTIMECLASSLIST);
「类别型录网」
return pClass;
}
}
。。。
}
520
…………………………………………………………Page 583……………………………………………………………
第8章 Document…View 深入探討
D
void CStroke::Serialize(CArchive& ar)
void CStroke::Serialize(CArchive& ar)
{
{
if (ar。IsStoring())
if (ar。IsStoring())
{
{
。。。
。。。
}
}
else
else
{
{ 本例读入 0002
WORD w;
WORD w;
ar 》》 w;
ar 》》 w;
m_nPenWidth = w;
m_nPenWidth = w;
m_pointArray。Serialize(ar);
m_pointArray。Serialize(ar);
}
}
}
}
void CDWordArray::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar。IsStoring())
{
。。。
}
else 本例读入 0002
{
DWORD nOldSize = ar。ReadCount ();
SetSize(nOldSize);
ar。Read (m_pData; m_nSize * sizeof(DWORD));
}
}
本例读入 00000019; 00000016; 00000019; 00000016
注意,别忘了, 使用的数组类别其实是
Scribble
,这里的
CArray CDWordArray
只是为了方便解说。请看本章“台面上的 动作 页)中的方块说明。
Serialize ( #501
521
…………………………………………………………Page 584……………………………………………………………
第篇 深入 MFC 程式設計
DYNAMIC / DYNCREATE / SERIAL 三 “宏”
我猜你被三组看起来难分难解的宏困扰着,它们是:
DECLARE D YNAMIC IMPLEMEN T D YNAMIC
_ / _
DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE
DECLARE_SERIAL / IMPLEMENT_SERIAL
事实上我已经在第3章揭露其源代码及其观念了。这里再以图8…7 三张图片把宏原始
码、展开结果、以及带来的影响做个整理。SERIAL 宏中比较令人费解的是它对》》 运
算子的多载动作。稍后我有一个CArchive 小节,会交待其中细节。
你将在图8…7abc 中看到几个令人困惑的大写常数,像是AFXAPI 、AFXDATA 等等。
它们的意义可以在VC++ 5。0 的DEVSTUDIOVCMFCINCLUDEAFXVER_。H 中获得:
// AFXAPI is used on global public functions
#ifndef AFXAPI
#define AFXAPI __stdcall
#endif
#define AFX_DATA
#define AFX_DATADEF
后二者就像afx_msg 一样(我曾经在第6章的Hello MFC 源代码一出现之后解释过),
是一个〃intentional placeholder〃,可能在将来会用到,目前则为「无物」。
尔曰显浅,彼云艰深,唯其深入,所以浅出
522
…………………………………………………………Page 585……………………………………………………………
。H
#define DECLARE_DYNAMIC (class_name) AFX。H
class CFoo : public CObject #define DECLARE_DYNAMIC (class_name)
public:
{ public:
static AFX_DATA CRuntimeClass class##class_name;
DECLARE_DYNAMIC (CFoo) static AFX_DATA CRuntimeClass class##class_name;
virtual CRuntimeClass* GetRuntimeClass() const;
。。。 virtual CRuntimeClass* GetRuntimeClass() const;
}
class CFoo : public CObject
。CPP {
public:
IMPLEMENT_DYNAMIC (CFoo; CObject) static AFX_DATA CRuntimeClass classCFoo;
virtual CRuntimeClass* GetRuntimeClass () const;
。。。
AFX。H }
#define IMPLEMENT_DYNAMIC (class_name; base_class_name)
#define IMPLEMENT_DYNAMIC (class_name; base_class_name)
_IMPLEMENT_RUNTIMECLASS(class_name; base_class_name; 0xFFFF; NULL)
_IMPLEMENT_RUNTIMECLASS(class_name; base_class_name; 0xFFFF; NULL)
#define _IMPLEMENT_RUNTIMECLASS (class_name; base_class_name; wSchema; pfnNew)
#define _IMPLEMENT_RUNTIMECLASS (class_name; base_class_name; wSchema; pfnNew)
AFX_DATADEF CRuntimeClass class_name::class##class_name = {
AFX_DATADEF CRuntimeClass class_name::class##class_name = {
#class_name; sizeof(class class_name); wSchema; pfnNew;
#class_name; sizeof(class class_name); wSchema; pfnNew;
RUNTIME_CLASS(base_class_name); NULL };
RUNTIME_CLASS(base_class_name); NULL };
第
static const AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
static const AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);
8
CRuntimeClass* class_name::GetRuntimeClass() const
CRuntimeClass* class_name::GetRuntimeClass() const
{ return &class_name::class##class_name; } 章
{ return &class_name::class##class_name; } #define RUNTIME_CLASS (class_name)
#define RUNTIME_CLASS (class_name)
(&class_name::class##class_name) D
(&class_name::class##class_name) o