读侯俊杰的《深入浅出MFC》小记

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









你可能感兴趣的:(读侯俊杰的《深入浅出MFC》小记)