现在的位置: 首页 > 综合 > 正文

MFC深入浅出-MFC对象的创建

2011年06月04日 ⁄ 综合 ⁄ 共 6372字 ⁄ 字号 评论关闭
MFC对象的创建

 

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

 

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

 

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

 

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

 

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

 

  1. MFC对象的关系

     

  2. 创建关系

     

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

     

     

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

     

    创建者

     

    被创建的对象

     

    应用程序对象

     

    文档模板

     

    文档模板

     

    文档

     

    文档模板

     

    边框窗口

     

    边框窗口

     

     

     

  3. 交互作用关系

     

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

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

 

图 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或派生类的实例;成员函数列中如果没有指定类属,就是第一列对象的类的成员函数。

 

  • MFC提供的接口

     

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

     

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

  • 虚拟函数接口

     

    几乎每一个 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支持)

     

     

    视窗口激活时调用

     

    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

     

    ="43%">

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

     

    SaveModified

     

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

     

    PreCloseFrame

     

    在框架窗口关闭之前调用

     

     

  • 消息映射方法和标准命令消息

     

  • 窗口对象可以响应以“ 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_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

     

     

  • MFC对象的创建过程

     

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

     

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

     

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

     

    本节将主要分析应用程序对象、文档对象、文档模板等

  • 抱歉!评论已关闭.