C++语法理解
1.静态数据成员具有静态生存期。
2.派生类与基类共享一份静态成员数据。
引用C++ primer的一段话:
"If a base class defines a static member there is only one such member defined for the entire hierarchy. Regardless of the number of classes derived from the base class, there
exists a single instance of each static member."
3.用static声明外部变量。又称静态外部变量。静态外部变量作用域只限于本文件,其它文件不可使用extern扩展其作用域。可以避免其它文件误用。
4.常成员函数。使用const关键字修饰的函数为常成员函数。常成员函数不能更改对象数据成员,也不能调用该对象中没有用const修饰的成员函数。
5.子类与基类同名静态成员不会发生覆盖。静态成员可以用类名区分。
VS使用技巧
1.只有把类的定义文件显示地加入工程,类的定义才会在[class
view]中显示。不能只使用#include "header.h"。
2.工程中使用MFC类时,只要include相关头文件,并在工程设置中,选择使用MFC
DLL就可以了。
MFC代码(VC6.0)
1.尽可能地使用传给宏的class_name,和使用static修饰外部变量(注意是外部变量,不是类中的静态成员),
以避免名字污染。
2.AFX_CLASSINIT是一个只有构造函数的类。在其构造函数中把CRuntimeClass指针添加到“类别型录网”中。在IMPLEMENT_宏中定义了一个static
AFX_CLASSINIT变量,负责添加工作。
3.DECLARE_DYNAMIC与DECLARE_DYNCREATE为DECLARE_SERIAL而服务。有点若没有DECLARE_SERIAL,DECLARE_DYNAMIC与DECLARE_DYNCREATE就没有存在的意思。因为三个宏的关系是:后面的宏是对前面宏的补充。而且在实现宏中只有IMPLEMENT_SERIAL定义了AFX_CLASSINIT变量。意味着DECLARE_DYNCREATE与DECLARE_DYNAMIC中的CRuntimeClass没有加入“类别型录网”,都是独立的。
定义宏:
实现宏:
4.DECLARE_DYNCREATE
中将CObject* PASCAL CreateObject();用static修饰的原因:
(1)CObject* PASCAL CreateObject();将会赋值给CRuntimeClass的m_pfnCreateObject,而后者是一个指向普通函数的指针。只有类成员函数为静态时,才能典型赋值给一个普通函数指针。不把m_pfnCreateObject定义成类成员函数,可以免去麻烦的类别转换。
(2)使用CreateObject不依赖对象而存在,方便动态创建。
5.DECLARE_DYNAMIC
中
virtual CRuntimeClass* GetRuntimeClass() 用const修饰的原因。
请注意在CObject中有下常成员函数:
BOOL
CObject::IsKindOf(const CRuntimeClass* pClass) const
{
***
CRuntimeClass* pClassThis = GetRuntimeClass();
return pClassThis->IsDerivedFrom(pClass);
}
其中使用了GetRuntimeClass,根据c++语法理解4,GetRuntimeClass必须为常成员函数。
6._DECLARE_DYNAMIC
中的static AFX_DATA CRuntimeClass class##class_name;标识的一张“名片”,因为它是静态的,根据c++语法理解1、2。该名片有全局变量的作用。意思就是只要定义了这个类,就相当于定义了一个全局变量。且在继承过程中名片只保留了一份。
7. #define
DECLARE_MESSAGE_MAP() /
private: /
static const AFX_MSGMAP_ENTRY _messageEntries[]; /
protected: /
static AFX_DATA const AFX_MSGMAP messageMap; /
virtual const AFX_MSGMAP* GetMessageMap() const; /
根据c++语法理解5,在基类与子类同时添加同名静态变量,是不会出问题的。
注意vs2005中DECLARE_MESSAGE_MAP不再包含这两个静态成员。而在BEGIN_MESSAGE_MAP
END_MESSAGE_MAP两个宏共同构造的GetThisMessageMap函数内部使用了这两个构造发。
分享到:
相关推荐
MFC实现动态创建COMBOX控件以及CHECKBOX控件的例子,还有在类里头创建线程的应用
通常我们都是使用MFC的资源视图在对话框或FormView上通过拖拽的方式添加按钮,这里我们利用CButton对象来动态创建按钮,并对按钮添加单击消息响应。如果你有任何疑问,欢迎和我讨论。
基于VS2017,使用MFC,使用CreateWindow,CreateWindowEx动态创建窗口与对话框
MFC动态创建按钮,添加了消息响应,并可以改变按钮字体。
MFC中动态创建连续多个按钮,并能释放掉,自己写的一个程序!很有参考价值!
封装了三种创建控件 CreateDynControl(CTRLT_BUTTON,"我是按钮",10,20,100,40,NULL); CreateDynControl(CTRL_STATIC,"我是静态文本",150,20,100,45,NULL); CreateDynControl(CTRL_EDIT,"我是编辑框",10,100,120,40...
在MFC中创建动态控件的生成与响应 一、创建动态控件 1.建立控件ID号: 2.建立控件对象: 二、动态控件的响应: 1.在MESSAGE_MAP中添加响应函数: 2.在头文件中添加函数定义: 3.编写消息响应函数: 三、回收...
在MFC中动态创建了100个按钮,然后进行重绘,同时显示位图和文本,创建后可以删除所有按钮,然后再创建,界面很漂亮,功能很强大,没有BUG!不下会后悔的!如果觉得好请给好评哈
MFC视图动态创建button和progressCtrl,内有详细代码,很好用
纯正的封装,算是彻底实现MFC程序的界面动态配置,是实现界面和功能的分离的基础
win32以及MFC动态创建窗口和各种控件的方法
mfc动态创建控件示例
MFC的RTTI技术及动态创建的实现 详细介绍
如何在MFC中动态创建控件以及如何响应动态创建的控件的事件
这是一个动态创建按钮并响应消息快捷键的demo
MFC 宏定义详解 MFC 宏定义详解 MFC 宏定义详解
MFC 基于对话框的程序,在对话框上右键显示快捷菜单,菜单为多级菜单。
本资料介绍了动态创建控件的过程、步骤 及其事件响应 有实例参考
MFC如何创建子窗口subwindow,并任意激活子窗口与主窗口,是初学者不可多得的实例,简单明了. 本实例是在VC6.0下.
这是用MFC写的动态链接库的创建与使用,其中涉及了多类聚合的导出,与头文件的巧妙使用。