虚拟函数-5、虚拟函数在MFC中的应用

MFC作为一个宠大的类库,包含深层的派生类和多个类分支。在整个CObject类家族中,以及在每个类分支中,基类都相应地定义了虚拟函数。至于定义虚拟函数的必要性,在2.4节中已经讨论很多,下面还是对MFC中定义或重载虚拟函数的情况简单例举。

CObject类是MFC类库之母,它为其派生类提供的几项功能支持,多数是以虚拟函数的形式出现的。或者说,CObject类的作用就是为其派生类定义了若干完成某项功能的虚函数,供派生类重载,供类的使用者调用。从而,类的使用者(如调用其虚拟函数的外部函数)对于整个类体系而言,就是通用函数。

CObject类定义了以下虚函数,分别提供类的诊断、类的连载、类的运行时信息等功能支持。

virtual void AssertValid() const;//供派生类重载,诊断对象的有效性

virtual void Dump(CDumpContext& dc) const;//供派生类重载,输出对象的调试信息

virtual void Serialize(CArchive& ar);//供派生类重载,实现对象的连载操作

virtual CRuntimeClass*GetRuntimeClass()const;//供派生类重载,提供类的运行时信息

另外,在相对于类分支的基类中,也需要定义自己的虚拟函数,因为每个类分支都表现一个相对独立的抽象语义。例如窗口封装类CWnd,对于它定义的窗口创建函数Create(),我们再熟悉不过了。该函数在CWnd中定义为虚拟函数,而每个CWnd的派生类,如CDialog、CFrameWnd、CFormView,以及大量的控件封装类等,几乎都需要重载它,为创建自己独特风格和行为的窗口指定参数信息。例如:

BOOL CDialog::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL);

BOOL CToolBar::Create(CWnd* pParentWnd,DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,UINT nID = AFX_IDW_TOOLBAR);

BOOL CEdit::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

BOOL CListBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

 

BOOL CTreeCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

不但如此,为了派生类能够有机会处理在整个窗口生存周期中发生的事件,以及窗口接收的消息,CWnd类也定义了相关的虚拟函数。这些虚拟函数或者在窗口生存周期的某个阶段被调用,或者用于接收窗口消息,例如:

//关于窗口生存周期的虚拟函数

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//创建窗口之前

virtual void PreSubclassWindow();//子类化Windows窗口对象之前

virtual BOOL DestroyWindow();//销毁窗口时

virtual void PostNcDestroy();//最后一个窗口消息到来时

//用于接收和处理窗口消息的虚拟函数

//默认的消息处理函数

virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);

//窗口消息在CWnd封装类中的入口,CWnd在此分发消息

virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);

//窗口消息处理函数

virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);

posted on 2011-05-09 18:02  carekee  阅读(542)  评论(0编辑  收藏  举报