5MFC对象的创建Word格式文档下载.docx
《5MFC对象的创建Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《5MFC对象的创建Word格式文档下载.docx(57页珍藏版)》请在冰豆网上搜索。
GetNextView
GetDocTemplate
CView对象
文档对象
GetDocument
GetParentFrame
CMDIChildWnd或
CFrameWnd对象
活动视
GetActiveView
活动视的文档
GetActiveDocument
CMDIFrameWnd对象
活动文档边框窗口
MDIGetActive
表5-3从一个对象通知另一个对象的方法:
要通知的对象/动作
通知文档更新所有视
CDocument:
:
UpdateAllViews
更新一个视
CView:
OnUpdate
CFrameWnd或
通知一个视为活动视
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-specificidle-time处理
PreTranslateMessage
在消息送给Windows函数TranslateMessageandDispatchMessage.之前进行消息过滤
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
用来打印或打印预览文档
用来通知一个视的关联文档内容已经变化
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
ID_FILE_OPEN
OnFileOpen
ID_FILE_CLOSE
OnFileClose
ID_FILE_SAVE
OnFileSave
ID_FILE_SAVE_AS
OnFileSaveAs
ID_FILE_SAVE_COPY_AS
OnFileSaveCopyAs
COleServerDoc
ID_FILE_UPDATE
OnUpdateDocument
ID_FILE_PAGE_SETUP
OnFilePrintSetup
ID_FILE_PRINT
OnFilePrint
ID_FILE_PRINT_PREVIEW
OnFilePrintPreview
ID_FILE_MRU_FILE1...FILE16
OnUpdateRecentFileMenu
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
ID_WINDOW_ARRANGE
OnMDIWindowCmd
ID_WINDOW_CASCADE
ID_WINDOW_TILE_HORZ
ID_WINDOW_TILE_VERT
ID_WINDOW_SPLIT
CSplitterWnd
ID_APP_ABOUT
ID_APP_EXIT
OnAppExit
ID_HELP_INDEX
OnHelpIndex
ID_HELP_USING
OnHelpUsing
ID_CONTEXT_HELP
OnContextHelp
ID_HELP
OnHelp
ID_DEFAULT_HELP
ID_NEXT_PANE
OnNextPaneCmd
ID_PREV_PANE
ID_OLE_INSERT_NEW
ID_OLE_EDIT_LINKS
ID_OLE_VERB_FIRST...LAST
ID_VIEW_TOOLBAR
ID_VIEW_STATUS_BAR
ID_INDICATOR_CAPS
ID_INDICATOR_NUM
ID_INDICATOR_SCRL
ID_INDICATOR_KANA
OnUpdateKeyIndicator
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-6CwinThread的成员变量
访问限制
变量名称
类型
解释
√
public
m_bAutoDelete
BOOL
指定线程结束时是否销毁线程对象本身
m_hThread
HANDLE
当前线程的句柄
m_nThreadID
UINT
当前线程的ID
m_pMainWnd
CWnd*
指向应用程序主窗口的指针
m_pActiveWnd
当OLESERVER就地激活时指向客户程序主窗口的指针
m_msgCur
MSG
当前消息(MSG结构)
m_pThreadParams
LPVOID
传递给线程开始函数的参数
m_pfnThreadProc
函数指针1
线程开始函数,AFX_THREADPROC类型
m_lpfnOleTermOrFreeLib
函数指针2
OLE用途,void(AFXAPI*fn)(BOOL,BOOL)
m_pMessageFilter
指针
OLE消息过滤,指向COleMessageFilter对象
protected
m_ptCursorLast
CPoint
最新鼠标位置
m_nMsgLast
消息队列中最新接收到的消息
表5-7CWinApp的成员变量
m_pszAppName
LPCTSTR
应用程序名称
m_hInstance
HINSTANCE
标志应用程序当前实例句柄
m_hPrevInstance
32位程序设为空
m_lpCmdLine
LPTSTR
指向应用程序的命令行字符串
m_nCmdShow
int
指定窗口开始的显示方式
m_bHelpMode
标识用户是否在上下文帮助模式
m_pszExeName
应用程序的模块名
m_pszHelpFilePath
应用程序的帮助文件名,缺省时同模块名
m_pszProfileName
应用程序的INI文件名,缺省时同应用程序名
m_pszRegistryKey
Register入口,如果不指定,使用INI文件。
m_pDocManager;
CDocManager*
指向一个文档模板管理器
m_hDevMode
HGLOBAL
打印设备模式
m_hDevNames
打印设备名称
m_dwPromptContext
DWORD
被MESSAGEBOX覆盖的帮助上下文
m_nWaitCursorCount
等待光标计数
m_hcurWaitCursorRestore
HCURSOR
保存的光标,在等待光标之后恢复
m_pRecentFileList
指向CRecentFileList对象,最近打开的文件列表
m_atomApp
ATOM
DDE用途
m_atomSystemTopic
m_nNumPreviewPages
缺省被打印的页面
m_nSafetyPoolSize
size_t
理想尺寸
m_lpfnDaoTerm
函数指针
DAO初始化设置时使用
2.CDocument的成员变量
表5-8文档对象的属性。
m_strTitle
CString
文档标题
m_strPathName
文档路径
m_pDocTemplate
CDocTemplate*
指向文档模板的指针
m_viewList
CPtrList
关联的视窗口列表
m_bModified
文档是否有变化、需要存盘
关联视都关闭时是否删除文档对象
m_bEmbedded
文档是否由OLE创建