讲解越详细越清楚  分越多。但要正确呀!  嘿嘿                 分不够可以加。
拜托了

解决方案 »

  1.   

    在文档视结构里,文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元;另外它还提供了管理和维护数据的手段。
    视图是数据的用户窗口,为用户提供了文档的可视的数据显示,它把文档的部分或全部内容在窗口中显示出来。视图还给用户提供了一个与文档中的数据交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会有一个或多个视图显示,一个文档可以有多个不同的视图。
    有两种类型的文档视结构程序:单文档界面(SDI)应用程序和多文档界面(MDI)应用程序。l 文档模板 文档模板负责创建文档、视图和框架窗口。一个应用程序对象可以管理一个或多个文档模板,每个文档模板用于创建和管理一个或多个同种类型的文档(这取决于应用程序是单文档SDI程序还是多文档MDI程序)。那些支持多种文档类型(如电子表格和文本)的应用程序,有多种文档模板对象。应用程序中的每一种文档,都必需有一种文档模板和它相对应。比如,如果应用程序既支持绘图又支持文本编辑,就需要一种一种绘图文档模板和文本编辑模板。
    MFC提供了一个文档模板类CDocTemplate支持文档模板。文档模板类是一个抽象的基类,它定义了文档模板的基本处理函数接口。由于它是一个抽象基类,因此不能直接用它来定义对象而必需用它的派生类。对一个单文档界面程序,使用CSingleDocTemplate(单文档模板类),而对于一个多文档界面程序,使用CMultipleDocTemplate。
    文档模板定义了文档、视图和框架窗口这三个类的关系。通过文档模板,我们可以知道在创建或打开一个文档时,需要用什么样的视图、框架窗口来显示它。这是因为文档模板保存了文档和对应的视图和框架窗口的CRuntimeClass对象的指针。此外,文档模板还保存了所支持的全部文档类的信息,包括这些文档的文件扩展名信息、文档在框架窗口中的名字、代表文档的图标等信息。说明:每个从CObject派生的类都与一个CRuntimeClass结构相关联。通过这个结构,你可以在程序运行时刻获得关于一个对象和它的基类的信息。在函数参数需要作附加类型检查时,这种运行时刻判别对象类型的能力是非常重要的。C++本身并不支持运行时刻类信息。CRuntimeClass结构包含一个以\0结尾的字符串类名、整型的该类对象大小、基类的运行时刻信息等。 一般在应用程序的InitInstance成员函数实现中创建一个或多个文档模板,如下所示。CEditorApp的InitInstance成员函数定义
    BOOL CEditorApp::InitInstance()
    {
    //标准的初始化代码
    //...... // Register the application's document templates.  Document templates
    // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CEditorDoc),
    RUNTIME_CLASS(CMainFrame),       // main SDI frame window
    RUNTIME_CLASS(CEditorView));
    AddDocTemplate(pDocTemplate); //其他的初始化代码和主框架窗口显示过程
    //......
    // Enable DDE Execute open
    EnableShellOpen();
    RegisterShellFileTypes(TRUE); // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line
    if (!ProcessShellCommand(cmdInfo))
    return FALSE; // The one and only window has been initialized, so show and update it.
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow(); // Enable drag/drop open
    m_pMainWnd->DragAcceptFiles();
    }

        在InitInstance中,首先声明一个CSingleDocTemplate*类型的单文档模板对象指针(因为这里的文本编辑器使用单文档界面)。然后创建该类型的模板对象。如果要使用多文档界面,只需要将这里的CSingleDocTemplate改为CMultiDocTemplate,当然CMainFrame也要改为从CFrameWnd改为CMDIChildWnd或其派生类。
    在CSingleDocTemplate构造函数中,还包含一个IDR_MAINFRAME参数。它指向一个字符串资源,这个字符串给出了文档所使用及显示时所要求的几个选项,包括文档名字、文档的文件扩展名、在框架窗口上显示的名字等等,我们称之为文档模板字符串。
    然后InitInstance调用AddDocTemplate将创建好的文档模板加入到应用程序可用的文档模板链表中去。这样,如果用户选择了File-New或File-Open菜单要求创建或打开一个文档时,应用程序类的OnNewDocument成员函数和OnOpenDocument()成员函数就可以从文档模板链表中检索出文档模板提示用户选择适当的文档类型并创建文档及相关的视图、框架窗口。
        应用程序对象的成员函数CWinApp::OnFileNew()在选择File菜单的New命令时被调用,缺省时在InitInstance()中也会被调用。原理是在InitInstance()中有一个命令行参数的执行过程,当命令行上没有参数时,函数ParseCommandLine(cmdInfo)会调用CCommandLineInfo :: 把m_nShellCommand成员置为CCommandLineInfo::FileNew,这导致ProcessShellCommand成员函数调用OnFileNew,OnFileNew又调用OnNewDocument。用户可在InitInstance()中显式的调用OnFileNew()。l CDocument:: OnNewDocument( )
    当用户启动应用程序,或从应用程序的File菜单种选择New选项时,都需要对文档类的数据成员进行初始化。文档类的数据成员初始化工作是在OnNewDocument成员函数中完成的。l CDocument::OnOpenDocument(LPCTSTR lpszPathName)
    当用户选择File->Open菜单命令并选择了一个文件后,框架会调用该函数打开文档。l CDocument::OnSaveDocument(LPCTSTR lpszPathName)
    当用户选择File->Save或File->Save as…时调用,用于保存文档数据。l CView::OnInitialUpdate()
    对视图数据进行初始化,此时视图窗口已建立。l CView::OnDraw
    用于重绘视图。l 在文档中引用视图类
    有时要在文档对象中访问视图对象,而一个文档可能会对应多个视图,此时可以采用如下方法:
    POSITION pos=GetFirstViewPosition();//获取视图链表的头指针
    CEditorView *MyView=(CMyView*)GetNextView(pos);l 在视图中引用文档
    CMyDoc* pDoc = GetDocument();l 文档修改时通知视图的更新
    当文档以某种方式变化时,必须通知视图作相应的更新即重绘,以反应文档的变化。此时,视图将调用文档的UpdateAllViews成员函数通知同一文档的所有视图对自己进行更新。UpdateAllViews将调用每个视图的OnUpdate成员函数,使视图的客户区无效,从而导致OnDraw的调用。