MFC 六大关键技术是什么? 1MFC 程序的初始化过程 2RTTI 动态类型标识 3Dynamic Creation 动态生成 4Persistence 永久保留 5Message Mapping 信息映射 6Message Routing 信息传递 怎样自制RTTI? 我们作为类库的设计者要在类构造起来的时候,记录必要的信息,以建立型录。型录中的类的信息,最好以链表方式连接起来。一般“类别型录”是一个结构,其中至少需要类名字,链表的Next指针,以及链表的First 指针。First 属于整体变量,一份就好,所以用 static 修饰。 为了将每一个类都能拥有成员变量集合,并且最好有一定的命名规则,然后经某种手段将整个类库构造好之后,“类别型录”(就是各个 CRuntimeClass 对象)则能呈现为: 什么是DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC 宏?作用就是完成RTTI 的“类别型录”。 为了将一个类对象塞到类之中,并定义一个可以捕捉到该对象地址的函数,定义一个宏为: #define DECLARE_DYNAMIC(class_name) public: static CRuntimeClass class##class_name; virtual CRuntimeClass* GetRuntimeClass()const; 比如我使用了 DECLARE_DYNAMIC(CView) 编译器预处理器为我做出的代码是: public: static CRuntimeClass classCView; virtual CRuntimeClass * GetRuntimeClass()const; 也就是定义类时,将类放入 DECLARE_DYNAMIC 宏就是把要放的对象放到了里边。具体连接工作是由IMPLEMENT_DYNAMIC 宏来实现: #define IMPLEMENT_DYNAMIC(class_name,base_class_name) _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL) 这里不做扩展,总之,IMPLEMENT_DYNAMIC 内容不仅制定初值,它使用了一个struct AFX_CLASSINIT {AFX_CLASSINTI(CRuntimeClass * pNewClass);}; (c++的struct 和class 都有构造函数): AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass*pNewClass) { pNewClass->m_NextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass; } 就是上边的这个构造函数完成了连接工作。 一般使用的形式是: class CView:public CWnd { DECLARE_DYNAMIC(CView) ... }; // in implementation file IMPLEMENT_DYNAMIC(CView CWnd) 这两个宏就完成了构造数据链表的工作。 怎样生成mfc 层次结构的类别型录? .h 文件中 class CObject{...}; class CCmdTarget:public CObject { DEC...