创建多个动态视图。如何使用文档/视图架构在您的 MDI 应用程序中初始化和使用其他不同的视图。OpenGL 窗口和对话框窗口的示例代码。






2.54/5 (30投票s)
2003 年 10 月 25 日
3分钟阅读

136117

2619
默认情况下,MDI MFC 生成的项目只有一个视图,这是一种添加更多 CView 派生类并初始化它们而无需添加任何特殊初始化代码的方法。
引言
示例代码有一个 OpenGL 视图,它派生自 CView
,还有一个由 App Wizard 在项目创建时创建的对话框视图。
如何使用我的 MDI MFC 应用程序获得多个视图?好吧,首先我在这里读到了一篇文章,它使用了一个选项卡控件并创建了 CView
派生类的实例并将它们放置在选项卡对话框中。这有效,但我不希望我的视图位于选项卡对话框中。这里有另一种方法可以做到这一点,而无需构建您自己的初始化代码。
我想在我的 MDI 应用程序上有一个 OpenGL 视图和一个对话框视图。通常,MDI 应用程序只有一个派生自 CView
的视图,我们都知道您可以通过转到“文件-新建”来创建该视图的多个实例。但是,如果您想拥有两个窗口等,例如 OpenGL 和对话框视图,该怎么办?您必须创建两个派生自 CView
的类并将它们放入 CMultiDocTemplate
中。
因此启动 App Wizard 并选择 CFormView
视图类而不是 CView
并确保您选择了 MDI 而不是 SDI。始终使用 MDI,因为,嘿,为什么不呢?您可以限制用户创建的窗口,但如果以后需要,也可以轻松添加新视图。现在,通过添加 .h 和 .cpp 添加 OpenglEnabledView
类。(示例可在 CodeProject 上找到,请查看有关使用的详细信息。这些文件也在我的项目中,但不是我的。)
在您的项目中,找到应用程序类,然后转到 initinstance
方法。搜索这个
//////////start snip CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_NeuralNetTwoTYPE, RUNTIME_CLASS(CNeuralNetTwoDoc), // custom MDI child frame RUNTIME_CLASS(CChildFrame), //this is the default view created by app wizard. RUNTIME_CLASS(CGLEnabledView)); AddDocTemplate(pDocTemplate); ////endsnip
所以你想做的是向模板管理器添加一个新模板。为此,只需复制该模板并添加您派生自 CView
的其他视图类即可。
///start snip CMultiDocTemplate* pDocTemplate2; //notice: 2 -<< pDocTemplate2 = new CMultiDocTemplate(IDR_NeuralNetTwoTYPE, RUNTIME_CLASS(CNeuralNetTwoDoc), // custom MDI child frame RUNTIME_CLASS(CChildFrame), ////NOTICE!!!: that this is a diffrent cview class. RUNTIME_CLASS(CNeuralNetTwoView)); AddDocTemplate(pDocTemplate2); //end snip
现在,在这一点上,当您转到“文件-新建”时,您将可以选择要使用的文档模板。这看起来不太专业,如果您想自动打开两个对话框视图,则需要添加一些代码。要删除那个愚蠢的框,请在应用程序类的 initinstance
方法上的命令信息行之后添加此代码
CCommandLineInfo cmdInfo; //after this stock appwiz generated. <- cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing ; //add this to stop teh default from File_new from //getting called and bringing up that dialog.
现在,覆盖 CDocument
类的 file_new
消息处理程序。为此,将 File_new
的消息映射添加到您的主框架类。在 VS.NET 中,您可以通过右键单击类视图中的类并选择“属性”,然后单击闪电图标来更改属性。在 VS6 中,您可以使用类向导来映射消息。
//snipstart void CMainFrame::OnFileNew() { for(POSITION tPos = theApp.m_pDocManager->GetFirstDocTemplatePosition();tPos!=NULL;) { //get pointer to the CdocTemplates. CDocTemplate * ptempDocTemplate = theApp.m_pDocManager->GetNextDocTemplate (tPos); //this will make the view visible. ptempDocTemplate->OpenDocumentFile(NULL); } }//snipend
文档模板保存框架、文档和视图,您可以通过 DocTemplate 指针访问这些对象,DocTemplate 指针是从我们从 theApp
全局获取的文档管理器指针。CDocument
的 OpenDocumentFile
方法将为您初始化这些对象,并将它们存储在文档管理器中,该管理器有一个指向派生类 CwinApp
的指针。
您还必须在您的文档类上添加 File_New
消息的消息处理程序代码。您将添加完全相同的代码,以便子框架也将打开这两个视图。
//snip start void CNeuralNetTwoDoc::OnFileNew() { for(POSITION tPos = theApp.m_pDocManager->GetFirstDocTemplatePosition();tPos!=NULL;) { CDocTemplate * ptempDocTemplate = theApp.m_pDocManager->GetNextDocTemplate (tPos); ptempDocTemplate->OpenDocumentFile(NULL); } }//snip end
该代码将对您在模板列表中拥有的所有文档调用 OpenDocumentFile
,这将为您初始化所有内容。
问题和评论:请发送电子邮件至 r_jay_thompson@hotmail.com。