2.7--如何编程来创建一个新(空)文档?

来源:互联网 发布:java多线程同步方法 编辑:程序博客网 时间:2024/05/17 07:30

      某些应用程序需要创建新(空)文档,而不需要强迫用户选择file->new菜单命令,例如:当用户在应用程序的窗口中执行某个特定的命令时将创建一个文档;或者执行另外的菜单命令时,间接的创建文档,下面的技术解释了如何达到想要的目的:

      第一种技术:

      如果打算正确的再现“File->New”行为,最简单的方法是通过发送适当的WM_COMMANDD消息来模仿“File->New”菜单命令:

                 AfxGetMainWnd()->SendMessage(WM_COMMAND,ID_FILE_NEW);

如果愿意,也可以采用PostMessage(WM_COMMAND,ID_FILE_NEW);这种指令通过正常的MFC消息映射处理来间接的调用CWinApp::OnFileNew().

 

      第二种技术:

      如果应用程序有多个文档模板对象,并且打算基于某个特定的文档模板来创建一个新文档,那么必须明确选择所使用的文档模板对象,并传输参数NULL来调用它自己的CMultiDocTemplate::OpenDocumentFile()函数

               m_ptTemplate->OpenDocumentFile(NULL);

      必须采用某种途径来存储各种文档模板对象的指针,这样,才能在上面这行代码中正确的设置m_ptTemplate指针。通常来说,存储这些指针的最简单方法是作为应用程序来的成员变量。

      这样要编写代码来创建一个基于特定模板的新文档,就可以在代码的任何地方简单的使用下面的调用:

              theApp.m_ptTemplate->OpenDocumentFile(NULL);

附加注释:

这两种解决方案都使用普通的 MFC文档模板对象创建机制 来创建新的文档对象、新的视图框架窗口、新的视图窗口。如果应用程序已经注册了多个文档模板( CWinApp::AddDocTemplate() ),那么第一种解决方案将正确的再现File->New行为,并提示用户选择要使用的文档模板----除非经过修改,不弹出对话框。

另一方面,第二种解决方案允许代码明确的选择所要使用的文档模板对象,这种方法可以很好的控制MFC将要创建的文档、视图、视图框架窗口对象的类。

如果打算使用第二种方案,并且不希望在CWinApp的派生类中暴露文档模板成员变量,那么可以把文档模板指针设为protected,而把文档创建逻辑封装在public成员变量中,代码如下:

 

可以如下调用创建新文档、框架、视图

CMyDoc1* pDoc=theApp.CreateNewDoc1();

这种实现中使用封装函数的一个优点是,我们返回一个正确定义了类型的指针时,该指针指向最新创建过的文档。这样,客户代码得到一个“真实的”CMyDoc1*指针,而无需进一步的向下映射。