1.程序必须在产生窗口之前先利用API函数RegisterClass设定属性(我们称此操作为注册窗口类)
2.消息循环中的TranslateMessage是为了将键盘消息转化,DispatchMessage会将消息传给窗口函数去处理。
3.注意,无论什么消息都必须被处理,所以switch/case指令中的default:处必须调用DefWindowProc,这是Window内部默认的消息处理函数。
4.【对话框的运行部分】,Modal对话框的激活与结束,靠的是DialogBox和EndDialog两个API函数。
模块定义文件(.def)
资源描述文件(.rc)
5,可以调用部分的,不牵扯到图形使用接口(GUI)的Win32API的程序称为console程序。
CSquare square//常常我们以C作为类名称的开头
{
private:
int m_color;//通常我们以m_作为成员变量的名称开头
public:
void display( ){.........}
void setcolor(int color){m_color=color;}
};
6.一般而言,成员变量尽量声明为private,成员函数则通常声明为public。上例的m_color既然声明为private,我们势必得准备一个成员函数setcolor,供外界设定颜色用。
7.虚函数与多态:
(0)虚函数的由来:人们提出这样的设想,能否用同一个调用形式,既能调用派生类的函数又能调用基类的同名函数。由此便产生了虚函数,虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
(1)如果你以一个“基类之指针”指向“派生类之对象”,那么经由该指针你只能够调用基类所定义的函数。
(2)如果你以一个“派生类指针”指向一个“基类之对象”,你必须先做明显的转型操作(explicit cast)。这种做法很危险,不符合真实生活经历,在程序设计上也会带给程序员困惑。------侯俊杰《深入浅出MFC》P59
从操作型定义来看,什么是虚函数呢?如果你预期派生类有可能重新定义某一个成员函数,那么你就在基类中把此函数设为virtual。MFC有两个十分十分重要的虚函数:与document有关的Serialize函数和与view有关的OnDraw函数。
(3)如果你期望派生类重新定义一个成员函数,那么你应该在基类中把此函数设为virtual。
(4)既然抽象类中的虚函数不打算被调用,我们就不应该定义它,应该把它设为纯虚函数(在函数声明之后加上“=0”即可)。纯虚函数不需定义其实际操作,它的存在只是为了在派生类中被重新定义,只是为了提供一个多态接口。只要是拥有纯虚函数的类,就是一种抽象类,它是不能够被实例化的,也就是说,你不可能跟具体产生一个对象。
(5)抽象类不能产生出对象实例,但是我们可以拥有指向抽象类的指针,以便于操作抽象类的各个派生类。
(6)虚函数派生下去仍为虚函数,而且可以省略virtual关键词。
虚函数的用法:
*在基类用virtual声明成员函数为虚函数。这样就可以再派生类中重新定义此函数,为它赋予新的功能,并能方便的被调用。在类外定义虚函数时,不必再加virtual(这一点很重要,记住,是在基类中用virtual声明,在派生类中就不用了。)
*在派生类中重新定义此函数时要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
*C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
*通过虚函数与指向基类对象的指针变量的配合使用,就能方便地调用同一类族中不同类对象的同名函数,只要先用基类指针指向对象即可。(特别重要)
多态:
从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。函数重载和运算符重载实现的是多态性属于静态多态性,动态多态性是在运行过程中才确定操作所针对的对象。动态多态性是通过虚函数实现的。
重载和虚函数的区别:
以前介绍的函数重载处理的是同一层次上的同名函数问题,二虚函数处理的是不同派生层次上的同名函数问题,前者是横向重载,后者可以理解为纵向重载。但与重载不同的是:同一类族的虚函数的首部是相同的,而函数重载时函数的首部是不同的(参数个数或类型不同)
2012.11.11续:
Afx全局函数:全局函数都是以Afx开头。例如:
AfxWinInit //被WinMain调用的一个函数,用做MFC GUI 程序初始化的一部分。
AfxBeginThread //开始一个新线程
AfxEndThread //结束一个旧的线程
AfxMessageBox //类似Windows API的MessageBox
AfxGetApp //获得application object(CWinApp派生对象)的指针
AfxGetMainWnd //获得程序主窗口的指针
AfxGetInstance //获得程序的Instance
AfxRegisterClass //以自定义的WNDCLASS注册窗口类(如果MFC提供的数个窗口类不能满足你)
等等。。。
Serialization(文件读写)
MFC Application
------------------------------------------------------------------------
CObject
CCmdTarget
CWinThread
CWinApp ---------两个比较重要的类
CMyWinApp
CWnd
CView
CMyView
CFrameWnd ---------两个比较重要的类
CMyFrameWnd
CDocument
CMyDoc