首页
论坛
专栏
课程

[原创]MFC框架学习笔记本(1)——类工厂

2009-6-24 16:17 12100

[原创]MFC框架学习笔记本(1)——类工厂

2009-6-24 16:17
12100
今天开始学习MFC框架原理,首先了解一下MFC框架类的派生机制,这其中老师提到了一个“类工

厂”的概念,工厂一个零件的产生流程大致如下:

原材料——>符合某种特性的材料(热处理改变物理性质)——>粗毛坯(粗步加工物理形状)——

>细坯(精加工物理形状)——>成品(经过一些表面特殊处理)

在此原材料是所有零件的基础,如同MFC中的COBJECT,其加工出来半成品都是属于由基类派生

出来的(派生类),相对于上一道工序来说是成品,相对于下一道工序来说是原料,因此在一个加

工环节需要指定它的原料与目标,下面来看一下CMyApp的产生流程:

CObject->CCmdTarget->CWinThread->CWinApp->CMyApp

CObject是所有派生类的基类,指定了其重要的公有属性:

静态库:用一个CRuntimeClass* m_pBaseClass来保存其父类的指针

动态DLL:用一个CRuntimeClass* (PASCAL* m_pfnGetBaseClass)()获取父类指针

这个指针被保存static const AFX_DATA CRuntimeClass class##class_name的结构中,

此结构如下:

struct CRuntimeClass
{
	LPCSTR m_lpszClassName;  
	int m_nObjectSize;              
	UINT m_wSchema; // schema number of the loaded class
	CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
#ifdef _AFXDLL
	CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
	CRuntimeClass* m_pBaseClass;
#endif
};
// Operations
	CObject* CreateObject();
	BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;

// Implementation
	void Store(CArchive& ar) const;
	static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);

	// CRuntimeClass objects linked together in simple list
	CRuntimeClass* m_pNextClass;       // linked list of registered classes


了解了派生关系后,我们再看看这些零件是如何被组装起来的,从工厂的角度来说,需要组装完成

一个产品,首先需要组装图纸,但是一般图纸是根据成熟的实验室产品来制定的,所以实验室出来

的产品是没有图纸,而且由实验过程制造出来的。。我们在写程序代码的过程就是制造这个产品的

实验过程,不同的添加资源、建立新类型的实例等等都是处于实验步骤,一旦按下F5就开始试车了

当然很多时候存在BUG,这时就需要微调了。。。经过N次反复操作以后程序终于运行了,产品出

来了,这时是没有图纸的,好在实验室有一个好的环境啊,给你忠实的记录下来了每一步的步骤并

且给你进行优化(开发环境的编译及优化过程),事实上我们写的MFC框架程序都是由框架帮我们

记录并管理的,所以我们实在太幸福了,由于运行期的初始化过程太多内容,暂时先不谈这个课程

先记住有一个叫m_classList的链表记录下了我们类的指针,在CRuntimeClass结构中有一个指

反映了这个过程(CRuntimeClass* m_pNextClass)......

综上所述,基于MFC COBJECT派生的类都有一个叫CRuntimeClass的静态结构记录下我们建立

的对象信息,因此在其派生类都有类似的过程,这一过程MFC框架会帮我们自动生成:

声明宏:DECLARE_DYNAMIC(class_name)

实现宏:IMPLEMENT_DYNAMIC(class_name)

为什么框架会做得如此复杂,其目的为自动化组装过程中的自动识别,定位,这些内容将在后续的

课程中得到解释

                                     文笔粗糙,仅以此加深记忆,望各位同学别笑话我

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

最新回复 (9)
creakerzgz 1 2009-6-27 20:10
2
0
恩,不错加油
suntiger 2009-6-27 20:29
3
0
期待全集,当时学这个东西的时候还有点晕,正好用你这个做教程了,嘿嘿!
疯子 4 2009-6-27 21:49
4
0
我到现在对MFC还是很不熟悉呢
方圆科技 3 2009-6-29 17:02
5
0
写的不错。。。期待你的全集
郭gang 2009-6-30 02:01
6
0
多谢xionw,加油出全集吧!!
西风梦客 2009-7-7 08:57
7
0
好帖,希望楼主继续~
xionw 2009-7-11 13:25
8
0
愧对大家的期许了,最近杂事特别多,没有多少时间来写贴子,闲点的时候挤出点时间来完成这五节课的内容吧
bingghost 2013-8-20 11:33
9
0
学习了....
龙飞雪 2015-8-3 14:24
10
0
当时没好好学,现在也搞的不太明白。
游客
登录 | 注册 方可回帖
返回