65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.54/5 (30投票s)

2003 年 10 月 25 日

3分钟阅读

viewsIcon

136117

downloadIcon

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 全局获取的文档管理器指针。CDocumentOpenDocumentFile 方法将为您初始化这些对象,并将它们存储在文档管理器中,该管理器有一个指向派生类 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

© . All rights reserved.