一、MFC的文档
1、相关问题
文档类 - 负责管理数据,封装了和视图窗口以及框架窗口之间的操作
CDocument - 父类CCmdTarget
2、文档类的使用
2.1首先利用pFrame调用LoadFrame函数,创建主框架窗口
2.2在主框架窗口WM_CREATE消息处理中创建视图窗口
2.3在视图窗口WM_CREATE消息处理中将文档类对象和视图类对象建立绑定关系
//文档类用一个链表成员保存和文档类对象相关联的视图类对象
m_viewList.AddTail(pView);
//视图类用一个普通成员保存和视图类对象相关联的文档类对象
pView->m_pDocument = this;
经分析可知:
文档类用一个链表保存视图类对象:说明一个文档类对象可以和多个视图类对象关联(绑定)
视图类用一个普通成员保存文档类对象:说明一个视图类对象只能和一个文档类对象关联(绑定)
3、对象的关系图
theApp
|---->m_pMainWnd
|---->m_pViewActive
|---->m_pDocument
|---->m_viewList(保存视图类对象地址)
4、文档类和视图类之间的操作
4.1 CView::GetDocument() -可以获取和视图类相关联的文档类对象
4.2 CView::OnUpdate -虚函数,刷新视图窗口
4.3 CDocument::UpdateAllViews -可以触发所有和这个文档类对象相关联的视图类对象(视图窗口)刷新
5、命令消息(WM_COMMAND)的处理顺序
View->Document->Frame->App
二、文档类中文件相关功能
程序的文档类中有一个OnNewDocument虚函数,该函数是【文件新建】命令处理的一部分;
1、修改单文档程序/多文档程序的程序窗口标题
方法一:
在程序的文档类中的虚函数OnNewDocument中添加:SetTitle("程序窗口的新标题");
方法二:
在程序的字串表资源中找到资源:IDR_MAINFRAME,该资源字符串是由“ ”分隔的7个子串;可利用文档模板类CDocTemplate的成员函数:GetDocString来获取各个子串:
virtual BOOL GetDocString( CString& rString, enum DocStringIndex index ) const;
rString:是一个CString对象的引用,当函数返回时,该参数将包含要查找的子串;
index:枚举类型,指定将要查找的子串的索引,与IDR_MAINFRAME字符串资源中的7个子串的顺序一致,包括:
CDocTemplate::windowTitle --主窗口标题栏上的字符串,仅在单文档程序出现,多文档程序将以IDR_MAINFRAME字符串为默认值
CDocTemplate::docName --默认文档的名称,无指定时默认为“无标题”
CDocTemplate::fileNewName --文档类型的名称;如果程序指定支持多种类型的文档,此字符串将显示在“新建”文件对话框中
CDocTemplate::filterName --文档类型的描述和一个适用于此类型的通配符过滤器,这个字符串将出现在“打开”文件对话框中的文件类型列表框中,要和CDocTemplate::filterExt一起使用;
CDocTemplate::filterExt --文档的扩展名,如果没有指定就不能在“打开”文件对话框中处理这种文档,要和CDocTemplate::filterName一起使用
CDocTemplate::regFileTypeId --如果以::RegisterShellFileTypes向系统的注册表注册文件类型,此值会出现在HKEY_CLASSES_ROOT之下成为其子项,并仅供Windows内部使用;如果没有指定,这种文件类型就无法注册
CDocTemplate::regFileTypeName --这也是存储在注册表中的文件类型名称,会显示于程序中用以访问注册表的对话框内