此技术点讲述了创建和所属权问题——对于WinApp(程序对象),DocTemplates(文档模板)Documents,Frame和View。[ 你也可以在Visual C++ Programmer's Guide(《程序员手册》)中找到相关问题的解答]
WinApp 一般地一个程序都有一个CWinApp对象,它被静态的创建并初值化。【参见相关语句】 这是由MFC框架内部在WinMain函数中实现的。
你必须从CWinApp导出自己的类,来做一些有用的工作。(注:DLL中无CWinApp对象。)
一个CWinApp对象拥有一系列文档模板(DocTemplate),其由CPtrList集成。
文档模板通常通过CWinApp::InitInstance函数,由资源文件(.rc)中的字符串资源导入。
pTemplate=new CDocTemplate(IDR_MYDOCUMENT,...);
对SDI应用(single doucument interface),此中CFrameWnd类窗口不仅作为程序的主窗口而且也是唯一的文档框架窗口。对于MDI应用(multiple document interface),此中的MDI_Frame(一般为CMDIFrameWnd)是作为应用程序之主窗口。它包容了所有的子CFrameWnd窗口。实际上,每个子窗口是类CMDIChildWnd,而此类继承了CFrameWnd.这种子窗口可作为文档框架窗口的一种潜在选择。
CDocTemplate 文档模板类是文档之创建者和管理者,它拥有其创建之文档。(如果你的程序使用基于资源之方法,即并非基于文档,它就不需要从CDocTemplate继承)。
对于SDI应用,类CSingleDocTemplate记录了一个打开的文档。对于MDI应用,类CMultiDocTemplate 记录了一个包含所有从此模板创建的当前打开之文档的列表(用类CPtrList)。
CDocTemplate::AddDocument和CDocTemplate::RemoveDocument两个虚拟成员函数,用于从模板中添加和移除某个文档。CDocTemplate是CDocument类之友元,因此我们可以通过设置保护成员变量CDocument::m_pDocTemplate来指定创建某文档的文档模板。CWinApp有OnFileOpen函数之缺省实现,该函数将会依次查询所有之文档模板。此实现还包括查找已经打开的文档和决定新文档以何种样式打开。
CDocTemplate类 管理文档和框架之间的UI绑定。CDocTemplate记录了未命名之文档数量。
CDocument(文档)
一个CDocument由一个CDocTemplate对象拥有。文档有一个当前已打开视图之列表(它们是从CView类继承而来)。文档通过一个CPtrList对象来和观察其内容之视图相联。
文档(或说文档类)并不创建/销毁视图,但二者在他们创建后即相互关联。当一个文档被关闭,(即通过菜单File/Close),其相关之视图也被关闭。与之相对,当某一文档之最后一个视图被关闭(Window/Close菜单),此文档也被关闭。文档类中AddView,RemoveView函数(界面)用于管理类中视图列表。CDocument是CView之友元类。因此我们可以设置CView::m_pDocument变量来回指。
CFrasmeWnd框架窗口
一个CFrameWnd在MFC1.0中被视作一个框架窗口,而现在CFrameWnd已经被设计成可直接用于许多场合而不需要导出新类的一个类。MFC中的导出类CMDIFrameWnd和CMDIChildWnd同样也被改进了,使得许多标准的操作命令已被完整实现了。CFrameWnd负责创建框架窗口之客户区的视窗控件。通常由一个主窗口控件(或称窗口)来填充框架窗口之客户区。
对于一个SDI-Frame框架或一个MDI-Child框架窗口,客户区通常由一个从CWiew导出类之对象来填充。对于一个MDI-Frame窗口,其客户区由MDICLIENT控件来填充。同时,MDICLIENT控件是所有MDI-Child框架窗口之父窗口。
WinApp 一般地一个程序都有一个CWinApp对象,它被静态的创建并初值化。【参见相关语句】 这是由MFC框架内部在WinMain函数中实现的。
你必须从CWinApp导出自己的类,来做一些有用的工作。(注:DLL中无CWinApp对象。)
一个CWinApp对象拥有一系列文档模板(DocTemplate),其由CPtrList集成。
文档模板通常通过CWinApp::InitInstance函数,由资源文件(.rc)中的字符串资源导入。
pTemplate=new CDocTemplate(IDR_MYDOCUMENT,...);
AddDocTemplate(pTemplate);
这个CWinApp对象拥有此程序中全部的框架窗口。程序的主框架窗口会被存储在CWinApp::m_pMainWnd中,通常如果你没有让AppWizard为你设置此值,你也可以在InitInstance函数中设置m_pMainWnd值。
对SDI应用(single doucument interface),此中CFrameWnd类窗口不仅作为程序的主窗口而且也是唯一的文档框架窗口。对于MDI应用(multiple document interface),此中的MDI_Frame(一般为CMDIFrameWnd)是作为应用程序之主窗口。它包容了所有的子CFrameWnd窗口。实际上,每个子窗口是类CMDIChildWnd,而此类继承了CFrameWnd.这种子窗口可作为文档框架窗口的一种潜在选择。
CDocTemplate 文档模板类是文档之创建者和管理者,它拥有其创建之文档。(如果你的程序使用基于资源之方法,即并非基于文档,它就不需要从CDocTemplate继承)。
对于SDI应用,类CSingleDocTemplate记录了一个打开的文档。对于MDI应用,类CMultiDocTemplate 记录了一个包含所有从此模板创建的当前打开之文档的列表(用类CPtrList)。
CDocTemplate::AddDocument和CDocTemplate::RemoveDocument两个虚拟成员函数,用于从模板中添加和移除某个文档。CDocTemplate是CDocument类之友元,因此我们可以通过设置保护成员变量CDocument::m_pDocTemplate来指定创建某文档的文档模板。CWinApp有OnFileOpen函数之缺省实现,该函数将会依次查询所有之文档模板。此实现还包括查找已经打开的文档和决定新文档以何种样式打开。
CDocTemplate类 管理文档和框架之间的UI绑定。CDocTemplate记录了未命名之文档数量。
CDocument(文档)
一个CDocument由一个CDocTemplate对象拥有。文档有一个当前已打开视图之列表(它们是从CView类继承而来)。文档通过一个CPtrList对象来和观察其内容之视图相联。
文档(或说文档类)并不创建/销毁视图,但二者在他们创建后即相互关联。当一个文档被关闭,(即通过菜单File/Close),其相关之视图也被关闭。与之相对,当某一文档之最后一个视图被关闭(Window/Close菜单),此文档也被关闭。文档类中AddView,RemoveView函数(界面)用于管理类中视图列表。CDocument是CView之友元类。因此我们可以设置CView::m_pDocument变量来回指。
CFrasmeWnd框架窗口
一个CFrameWnd在MFC1.0中被视作一个框架窗口,而现在CFrameWnd已经被设计成可直接用于许多场合而不需要导出新类的一个类。MFC中的导出类CMDIFrameWnd和CMDIChildWnd同样也被改进了,使得许多标准的操作命令已被完整实现了。CFrameWnd负责创建框架窗口之客户区的视窗控件。通常由一个主窗口控件(或称窗口)来填充框架窗口之客户区。
对于一个SDI-Frame框架或一个MDI-Child框架窗口,客户区通常由一个从CWiew导出类之对象来填充。对于一个MDI-Frame窗口,其客户区由MDICLIENT控件来填充。同时,MDICLIENT控件是所有MDI-Child框架窗口之父窗口。
对于CSplitterWnd而言,作为其父窗口客户区的视图窗口中填充了CSplitterWnd窗口对象。同时在其每个分离的窗格中,都有一个由CView类继承而来窗口类之对象作为CSplitterWnd之子窗口。(即客户区窗口)。