MFC对象的创建

MFC对象的创建

前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点;MFC对象的动态创建、序列化;MFC消息映射机制。

现在,考查MFC的应用程序结构体系,即以文档-视为核心的编程模式。学习本章,应该弄清楚以下问题:

MFC中诸多MFC对象的关系:应用程序对象,文档对象,边框窗口对象,文档边框窗口对象,视对象,文档模板对象等。

MFC对象的创建和销毁:由什么对象创建或销毁什么对象,何时创建,何时销毁?

MFC提供了那些接口来支持其编程模式?

  1. MFC对象的关系

    1. 创建关系

      MFC教程 - カ  - 问天何时老,问地何时绝

      这里讨论应用程序、文档模板、边框窗口、视、文档等的创建关系。图5-1大略地表示了创建顺序,但表5-1更直接地显示了创建与被创建的关系。

       

      表5-1 MFC对象的创建关系

      创建者

      被创建的对象

      应用程序对象

      文档模板

      文档模板

      文档

      文档模板

      边框窗口

      边框窗口

       

    2. 交互作用关系

    应 用程序对象有一个文档模板列表,存放一个或多个文档模板对象;文档模板对象有一个打开文档列表,存放一个或多个已经打开的文档对象;文档对象有一个视列 表,存放显示该文档数据的一个或多个视对象;还有一个指针指向创建该文档的文档模板对象;视有一个指向其关联文档的指针,视是一个子窗口,其父窗口是边框 窗口(或者文档边框窗口);文档边框窗口有一个指向其当前活动视的指针;文档边框窗口是边框窗口的子窗口。

    Windows 管理所有已经打开的窗口,把消息或事件发送给目标窗口。通常,命令消息发送给主边框窗口。

    MFC教程 - カ  - 问天何时老,问地何时绝

    图5-2大略地表示了上述关系:

    MFC提供了一些函数来维护这些关系。

    表5-2列出了从一个对象得到相关对象的方法。

    表5-2 从一个对象得到另一个对象的方法

    本对象

    要得到的对象

    使用的成员函数

    CDocument对象

    视列表

    GetFirstViewPosition

    GetNextView

    文档模板

    GetDocTemplate

    CView对象

    文档对象

    GetDocument

    边框窗口

    GetParentFrame

    CMDIChildWnd或

    CFrameWnd对象

    活动视

    GetActiveView

    活动视的文档

    GetActiveDocument

    CMDIFrameWnd对象

    活动文档边框窗口

    MDIGetActive

     

    表5-3 从一个对象通知另一个对象的方法:

    本对象

    要通知的对象/动作

    使用的成员函数

    CView对象

    通知文档更新所有视

    CDocument::UpdateAllViews

    CDocument对象

    更新一个视

    CView::OnUpdate

    CFrameWnd或

    CMDIFrameWnd对象

    通知一个视为活动视

    CView::OnActivateView

    设置一个视为活动视

    SetActivateView

    可以通过表5-2得到相关对象,再调用表5-3中相应的函数。例如:视在接受了新数据或者数据被修改之后,使用表5-2中的函数GetDocument得到关联文档对象,然后调用表5-3中的文档函数UpdateAllViews更新其他和文档对象关联的视。

    在表5-2和表5-3中,CView对象指CView或派生类的实例;成员函数列中如果没有指定类属,就是第一列对象的类的成员函数。

  2. MFC提供的接口

    MFC 编程就是把一些应用程序特有的东西填入MFC框架。MFC提供了两种填入的方法:一种就是使用前一章论述的消息映射,消息映射给应用程序的各种对象处理各 种消息的机会;另一种就是使用虚拟函数,MFC在实现许多功能或者处理消息、事件的过程中,调用了虚拟函数来完成一些任务,这样就给了派生类覆盖这些虚拟 函数实现特定处理的机会。

    下面两节将列出两类接口,有两个目的:一是为了让读者获得整体印象,二是后文将涉及到或者讨论其中的许多函数时,不显得突兀。

    1. 虚拟函数接口

      几 乎每一个MFC类都定义和使用了虚拟成员函数,程序员可以在派生类中覆盖它们。一般,MFC提供了这些函数的缺省实现,所以覆盖函数应该调用基类的实现。 这里给出一个MFC常用虚拟函数的总览表(见表5-4),更详细的信息或它们的缺省实现动作参见MFC文档。由于基类的虚拟函数被派生类继承,所以在派生 类中不作重复说明。

      覆盖基类的虚拟函数可以通过ClassWizard进行,不过,并非所有的函数都可以这样,有的必须手工加入函数声明和实现。

      表5-4 常见MFC类的虚拟函数接口

      虚拟函数

      覆盖的目的和功能

      CCmdTarget

      OnCmdMsg

      发送、派发命令消息

      OnFinalRelease

      OLE用途,引用为0时作清理工作

      CWinThread

      ExitInstance

      在线程退出时作清理工作

      InitInstance

      在线程开始时作初始化

      OnIdle

      执行thread-specific idle-time处理

      PreTranslateMessage

      在消息送给Windows函数TranslateMessage and DispatchMessage.之前进行消息过滤

      IsIdleMessage

      检查是否是某个特别的消息

      ProcessWndProcException

      截获线程消息/命令处理中的例外

      ProcessMessageFilter

      线程消息过滤

      Run

      实现线程特定的消息循环

      CWinApp

      HideApplication

      关闭所有的窗口之前隐藏应用程序

      CloseAllDocument

      退出程序之前关闭所有文档

      转下页

       

      续表

       

      SaveModifiedDocument

      框架窗口关闭时用来保存文档

      DoMessageBox

      实现客户化的messagebox

      DoWaitCursor

      关闭或打开等待光标

      OnDDeCommand

      响应DDE命令

      WinHelp

      调用WinHelp函数

      CWnd

      WindowProc

      提供一个窗口过程

      DefWindowProc

      为应用程序不处理的消息提供缺省处理

      PostNcDestroy

      在窗口销毁之后被消息处理函数OnNcDestroy调用

      OnNotify

      处理通知消息WM_NOTIFY

      OnChildNotify

      父窗口调用它给控制子窗口一个机会来处理通知反射消息

      DoDataExchange

      Updata调用它来进行对话框数据交换和验证

      CFrameWnd

      GetMessageBar

      返回一个指向框架窗口的状态条的指针

      OnCreateClient

      创建框架的客户窗口

      OnSetPreviewMode

      设置程序的主框架窗口进入或退出打印预览模式

      NegotiateBorderSpace

      协调边框窗口的边框空间的大小(OLE用途)

      CMDIFrameWnd

      CreateClient

      创建CMDIFrameWnd的MDICLIENT窗,被CWnd的消息处理函数OnCreate调用.

      转下页

       

      续表

       

      GetWindowMenuPopup

      返回窗口的弹出式菜单

      CDialog

      OnInitDialog

      对话框窗口的初始化

      OnSetFont

      设置对话框控制的文本字体

      OnOK

      模式对话框的OK按钮按下后进行的处理

      OnCancel

      模式对话框的CANCEL按钮按下后进行的处理

      CView

      IsSelected

      测试是否有一个文档被选择(OLE支持)

      OnActivateView

      视窗口激活时调用

      OnActivateFrame

      当包含视窗口的框架窗口变成活动或非活动窗口时调用

      OnBeginPrinting

      打印工作开始时调用,用来分配GDI资源

      OnDraw

      用来屏幕显示、打印、打印预览文档内容

      OnEndPrinting

      打印工作结束时调用,释放GDI资源

      OnEndPrintPreview

      退出打印预览模式时调用

      OnPrepareDC

      OnDraw或OnPrint之前调用,用来准备设备描述表

      OnPreparePrinting

      文档打印或者打印预览前调用,可用来初始化打印对话框

      OnPrint

      用来打印或打印预览文档

      OnUpdate

      用来通知一个视的关联文档内容已经变化

      CDocTemplate

      MatchDocType

      确定文档类型和文档模板匹配时的可信程度

      转下页

       

      续表

       

      CreateNewDocument

      创建一个新的文档

      CreateNewFrame

      创建一个包含文档和视的框架窗口

      InitialUpdateFrame

      初始化框架窗口,必要时使它可见

      SaveAllModified

      保存所有和模板相关的而且修改了的文档

      CloseAllDocuments

      关闭所有和模板相关的文档

      OpenDocumentFile

      打开指定路径的文件

      SetDefaultTitle

      设置文档窗口缺省显示的标题

      CDocument

      CanCloseFrame

      在关闭显示该文档的边框窗口之前调用

      DeleteContents

      用来清除文档的内容

      OnChangedViewList

      在与文档关联的视图被移走或新加入时调用

      OnCloseDocument

      用来关闭文档

      OnNewDocument

      用来创建新文档

      OnOpenDocument

      用来打开文档

      OnSaveDocument

      以来保存文档

      ReportSaveLoadException

      处理打开、保存文档操作失败时的例外

      GetFile

      返回一个指向Cfile对象的指针

      ReleaseFile

      释放一个文件以便其他应用程序可以使用

      SaveModified

      用来询问用户文档是否需要保存

      PreCloseFrame

      在框架窗口关闭之前调用

       

    2. 消息映射方法和标准命令消息

    窗 口对象可以响应以“WM_”为前缀的标准Windows消息,消息处理函数名称以“ON”为前缀。不同类型的Windows窗口处理的Windows消息 是有所不同的,因此,不同类型的MFC窗口实现的消息处理函数也有所不同。例如,多文档边框窗口能处理WM_MDIACTIVATE消息,其他类型窗口就 不能。程序员从一定的MFC窗口派生自己的窗口类,对感兴趣的消息,覆盖基类的消息处理函数,实现自己的消息处理函数。

    所 有的命令目标(CCmdTarger或导出类对象)可以响应命令消息,程序员可以指定应用程序对象、框架窗口对象、视对象或文档对象等来处理某条命令消 息。一般地,尽量由与命令消息关系密切的对象来处理,例如隐藏/显示工具栏由框架窗口处理,打开文件由应用程序对象处理,数据变化的操作由文档对象处理。

    对话框的控制子窗口可以响应各类通知消息。

    对于命令消息,MFC实现了一系列标准命令消息处理函数。标准命令ID在afxres.h中定义。表5-5列出了MFC标准命令的实现,从ID或者函数名可以大致地看出该函数的目的、功用,具体的实现有的后续章节会讲解,详细参见MFC技术文档。

    程序员可以自己来处理这些标准消息,也可以通过不同的类或从不同的类导出自己的类来处理这些消息,不过最好遵循MFC的缺省实现。比如处理ID_FILE_NEW命令,最好由CWinApp的派生类处理。

     

    表5-5 标准命令消息处理函数

    ID

    函数

    实现函数的类

    ID_FILE_NEW

    OnFileNew

    CWinApp

    ID_FILE_OPEN

    OnFileOpen

    CWinApp

    ID_FILE_CLOSE

    OnFileClose

    CDocument

    ID_FILE_SAVE

    OnFileSave

    CDocument

    ID_FILE_SAVE_AS

    OnFileSaveAs

    CDocument

    ID_FILE_SAVE_COPY_AS

    OnFileSaveCopyAs

    COleServerDoc

    ID_FILE_UPDATE

    OnUpdateDocument

    COleServerDoc

    ID_FILE_PAGE_SETUP

    OnFilePrintSetup

    CWinApp

    转下页

     

    续表

    ID_FILE_PRINT

    OnFilePrint

    CView

    ID_FILE_PRINT_PREVIEW

    OnFilePrintPreview

    CView

    ID_FILE_MRU_FILE1...FILE16

    OnUpdateRecentFileMenu

    CWinApp

    ID_EDIT_CLEAR

    CView没有实现,

    ID_EDIT_CLEAR_ALL

    但是,如果有实现

    ID_EDIT_COPY

    函数,就是派生类

    ID_EDIT_CUT

    CEditView的

    ID_EDIT_FIND

    实现函数

    ID_EDIT_PASTE_LINK

    ID_EDIT_PASTE_SPECIAL

    ID_EDIT_REPEAT

    ID_EDIT_REPLACE

    ID_EDIT_SELET_ALL

    ID_EDIT_UNDO

    ID_WINDOW_NEW

    OnWindowNew

    CMDIFrameWnd

    ID_WINDOW_ARRANGE

    OnMDIWindowCmd

    CMDIFrameWnd

    ID_WINDOW_CASCADE

    ID_WINDOW_TILE_HORZ

    ID_WINDOW_TILE_VERT

    ID_WINDOW_SPLIT

    CSplitterWnd

    ID_APP_ABOUT

    ID_APP_EXIT

    OnAppExit

    CWinApp

    ID_HELP_INDEX

    OnHelpIndex

    CWinApp

    ID_HELP_USING

    OnHelpUsing

    CWinApp

    ID_CONTEXT_HELP

    OnContextHelp

    CWinApp

    转下页

     

    续表

    ID_HELP

    OnHelp

    CWinApp

    ID_DEFAULT_HELP

    OnHelpIndex

    CWinApp

    ID_NEXT_PANE

    OnNextPaneCmd

    CSplitterWnd

    ID_PREV_PANE

    OnNextPaneCmd

    CSplitterWnd

    ID_OLE_INSERT_NEW

    ID_OLE_EDIT_LINKS

    ID_OLE_VERB_FIRST...LAST

    ID_VIEW_TOOLBAR

    CFrameWnd

    ID_VIEW_STATUS_BAR

    CFrameWnd

    ID_INDICATOR_CAPS

    ID_INDICATOR_NUM

    ID_INDICATOR_SCRL

    ID_INDICATOR_KANA

    OnUpdateKeyIndicator

    CFrameWnd

     

  3. MFC对象的创建过程

    应 用程序使用MFC的接口是把一些自己的特殊处理填入MFC框架,这些处理或者在应用程序启动和初始化的时候被调用,或者在程序启动之后和用户交互的过程中 被调用,或者在程序退出和作清理工作的时候被调用。这三个阶段中,和用户交互阶段是各个程序自己的事情,自然都不一样,但是程序的启动和退出两个阶段是 MFC框架所实现的,是MFC框架的一部分,各个程序都遵循同样的步骤和规则。显然,清楚MFC框架对这两个阶段的处理是很有必要的,它可以帮助深入理解 MFC框架,更好地使用MFC框架,更有效地实现应用程序特定的处理。

    MFC程序启动和 初始化过程就是创建MFC对象和Windows对象、建立各种对象之间的关系、把窗口显示在屏幕上的过程,退出过程就是关闭窗口、销毁所创建的 Windows对象和MFC对象的过程。所以,下面要讨论几种常用MFC对象的结构,它们是构成一个文档-视模式应用程序的重要部件。

    1. 应用程序中典型对象的结构

      本节将主要分析应用程序对象、文档对象、文档模板等的数据结构。通过考察类的结构,特别是成员变量结构,弄清它的功能、目的以及和其他类的关系;另外,在后续有关分析中必定会提到这些成员变量,这里先作个说明,到时也不会显得突兀。

      下 面几节以表格的形式来描述各个类的成员变量。表格中,第一列打钩的表示是MFC类库文档有说明的;没打钩的在文档中没有说明,如果是public,则可以 直接访问,但随着MFC版本的变化,以后MFC可能不支持这些成员;第二列是访问属性;第三列是成员变量名称;第四列是成员变量的数据类型;第五列是对成 员变量的功能、用途的简要描述。

      1. 应用程序类的成员变量

        应用程序对象的数据成员表由两部分组成,第一部分是CWinThread的成员变量,如表5-6所示,CWinApp继承了CWinThread的数据成员。第二部分是CWinApp自己定义的成员变量,如表5-7所示。

        表5-6 CwinThread的成员变量

         

        访问限制

        变量名称

        类型

        解释

        public

        m_bAutoDelete

        BOOL

        指定线程结束时是否销毁线程对象本身

        public

        m_hThread

        HANDLE

        当前线程的句柄

        public

        m_nThreadID

        UINT

        当前线程的ID

        public

        m_pMainWnd

        CWnd*

        指向应用程序主窗口的指针

        public

        m_pActiveWnd

        CWnd*

        当OLE SERVER就地激活时指向客户程序主窗口的指针

         

        public

        m_msgCur

        MSG

        当前消息(MSG结构)

         

        public

        m_pThreadParams

        LPVOID

        传递给线程开始函数的参数

         

        public

        m_pfnThreadProc

        函数指针1

        线程开始函数,AFX_THREADPROC类型

         

        public

        m_lpfnOleTermOrFreeLib

        函数指针2

        OLE用途,void (AFXAPI * fn)(BOOL,BOOL)

         

        public

        m_pMessageFilter

        指针

        OLE消息过滤,指向COleMessageFilter对象

         

        protected

        m_ptCursorLast

        CPoint

        最新鼠标位置

         

        protected

        m_nMsgLast

        UINT

        消息队列中最新接收到的消息

         

        表5-7 CWinApp的成员变量

         

        访问限制

        变量名称

        类型

        解释

        public

        m_pszAppName

        LPCTSTR

        应用程序名称

        public

        m_hInstance

        HINSTANCE

        标志应用程序当前实例句柄

        public

        m_hPrevInstance

        HINSTANCE

        32位程序设为空

        public

        m_lpCmdLine

        LPTSTR

        指向应用程序的命令行字符串

        public

        m_nCmdShow

        int

        指定窗口开始的显示方式

        public

        m_bHelpMode

        BOOL

        标识用户是否在上下文帮助模式

        public

        m_pszExeName

        LPCTSTR

        应用程序的模块名

        public

        m_pszHelpFilePath

        LPCTSTR

        应用程序的帮助文件名,缺省时同模块名

        public

        m_pszProfileName

        LPCTSTR

        应用程序的INI文件名,缺省时同应用程序名

        public

        m_pszRegistryKey

        LPCTSTR

        Register入口,如果不指定,使用INI文件。

         

        public

        m_pDocManager;

        CDocManager *

        指向一个文档模板管理器

         

        protected

        m_hDevMode

        HGLOBAL

        打印设备模式

         

        protected

        m_hDevNames

        HGLOBAL

        打印设备名称

         

        protected

        m_dwPromptContext

        DWORD

        被MESSAGE BOX覆盖的帮助上下文

         

        protected

        m_nWaitCursorCount

        int

        等待光标计数

         

        protected

        m_hcurWaitCursorRestore

        HCURSOR

        保存的光标,在等待光标之后恢复

         

        protected

        m_pRecentFileList

        指针

        指向CRecentFileList对象,最近打开的文件列表

         

        public

        m_atomApp

        ATOM

        DDE用途

         

        public

        m_atomSystemTopic

        m_atomApp

        DDE用途

         

        public

        m_nNumPreviewPages

        UINT

        缺省被打印的页面

         

        public

        m_nSafetyPoolSize

        size_t

        理想尺寸

         

        public

        m_lpfnDaoTerm

        函数指针

        DAO初始化设置时使用

      2. CDocument的成员变量

        表5-8 文档对象的属性。

         

        访问限制

        变量名称

        类型

        解释

         

        protected

        m_strTitle

        CString

        文档标题

         

        protected

        m_strPathName

        CString

        文档路径

         

        protected

        m_pDocTemplate

        CDocTemplate*

        指向文档模板的指针

         

        protected

        m_viewList

        CPtrList

        关联的视窗口列表

         

        protected

        m_bModified

        BOOL

        文档是否有变化、需要存盘

         

        public

        m_bAutoDelete

        BOOL

        关联视都关闭时是否删除文档对象

         

        public

        m_bEmbedded

        BOOL

        文档是否由OLE创建

      3. 文档模板的属性

      表5-9列出了文档模板的成员变量,5-10列出了单文档模板的成员变量,5-11列出了多文档模板的成员变量。单、多文档模板继承了文档模板的成员变量。

      表5-9 文档模板的数据成员

       

      访问限制

      变量名称

      类型

      解释

       

      public

      m_bAutoDelete

      BOOL

       
       

      public

      m_pAttachedFactory

      CObject *

       
       

      public

      m_hMenuInPlace

      HMENU

      就地激活时,OLE客户程序的菜单

       

      public

      m_hAccelInPlace

      HACCEL

      就地激活时,OLE客户程序的快捷键

       

      public

      m_hMenuEmbedding

      HMENU

       
       

      public

      m_hAccelEmbedding

      HACCEL

       
       

      public

      m_hMenuInPlaceServer

      HMENU

       
       

      public

      m_hAccelInPlaceServer

      HACCEL

       
       

      protected

      m_nIDResource

      UINT

      框架、菜单、快捷键等的资源ID

       

      protected

      m_nIDServerResource

      UINT

       
       

      public

      m_nIDEmbeddingResource

      UINT

       
       

      public

      m_nIDContainerResource

      UINT

       
       

      public

      m_pDocClass

      CRuntimeClass*

      指向文档类的动态创建信息

       

      public

      m_pFrameClass

      CRuntimeClass*

      指向框架类的动态创建信息

       

      public

      m_pViewClass

      CRuntimeClass*

      指向视类的动态创建信息,由字符串m_nIDResource描述

       

      public

      m_pOleFrameClass

      CRuntimeClass*

      指向OLD框架类的动态创建信息

       

      public

      m_pOleViewClass

      CRuntimeClass*

       
       

      public

      m_strDocStrings

      CString

      描述该文档类型的字符串

      表5-10 单文档模板的成员变量

       

      访问限制

      变量名称

      类型

      解释

       

      protected

      m_pOnlyDoc

      CDocment*

      指向唯一的文档对象

      表5-11 单文档模板的成员变量

       

      访问限制

      变量名称

      类型

      解释

       

      public

      m_hMenuShared

      HMENU

      该模板的MDI子窗口的菜单

       

      public

      m_hAccelTable

      HACCEL

      该模板的MDI子窗口的快捷键

       

      protected

      m_docList

      CPtrList

      该模板的文档列表

       

      protected

      m_nUntitledCount

      UINT

      用来生成文件名的数字,如”untitled0”的0。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值