C++ C++;MFC MDI数据作为文档不在磁盘上

C++ C++;MFC MDI数据作为文档不在磁盘上,c++,mfc,mdi,C++,Mfc,Mdi,我想使用MFC MDI,但我的数据(文档)不在磁盘上 我有根据输入生成数据的函数。 A型、B型等数据 我想为生成的每个新数据打开一个新选项卡 例如,如果生成的数据的输入是X,我想打开一个新选项卡,其名称为X。如果X存在,我想像MDI已经做的那样激活(前置)X选项卡 我的想法是有多个CMMultiDoctTemplate。每个都由不同的CDocument/CView派生类生成 我正在寻找一种解决方案来重载open/new函数,因此,与其从磁盘打开文件,不如让我的函数生成数据(CDocument)

我想使用MFC MDI,但我的数据(文档)不在磁盘上

我有根据输入生成数据的函数。 A型、B型等数据

我想为生成的每个新数据打开一个新选项卡

例如,如果生成的数据的输入是X,我想打开一个新选项卡,其名称为X。如果X存在,我想像MDI已经做的那样激活(前置)X选项卡

我的想法是有多个CMMultiDoctTemplate。每个都由不同的CDocument/CView派生类生成

我正在寻找一种解决方案来重载open/new函数,因此,与其从磁盘打开文件,不如让我的函数生成数据(CDocument)


此外,我不希望用户在CMultiDocTemplate/Cview之间进行选择,但我希望选择用于新选项卡的选项

我不确定这是否是您可能要查找的内容,但我使用了类似这样的代码,根据加载的文档将视图更改为不同的视图:

BOOL CCommunityTalksDoc::SwitchToView(CRuntimeClass* pNewViewClass)
{
    POSITION        rPos;
    CView           *pOldActiveView;
    CFrameWnd       *pChild;
    CCreateContext  context;
    BOOL            bAutoDelete;

    rPos = GetFirstViewPosition();
    pOldActiveView = GetNextView(rPos);
    pChild = pOldActiveView->GetParentFrame();

    // If we're already displaying this kind of view, no need to go further.
    if (pOldActiveView->IsKindOf(pNewViewClass))
        return TRUE;

    // Set flag so that document will not be deleted when view is destroyed.
    bAutoDelete = m_bAutoDelete;
    m_bAutoDelete = FALSE;
    // Delete existing view
    pOldActiveView->DestroyWindow();
    // restore flag
    m_bAutoDelete = bAutoDelete;

    // Create new view.
    m_pScriptView = (CScriptParseView*)pNewViewClass->CreateObject();
    if (m_pScriptView == nullptr)
    {
        TRACE1("Warning: Dynamic create of view type %s failed\n", pNewViewClass->m_lpszClassName);
        return FALSE;
    }

    // we must ensure the popup dialogues don't display
    m_pScriptView->SetBuildMode(FALSE);

    // Draw new view.
    context.m_pNewViewClass = pNewViewClass;
    context.m_pCurrentDoc = this;
    context.m_pNewDocTemplate = nullptr;
    context.m_pLastView = nullptr;
    context.m_pCurrentFrame = pChild;
    if (!m_pScriptView->Create(nullptr, nullptr, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), 
                pChild, AFX_IDW_PANE_FIRST, &context))
    {
        TRACE0("Warning: couldn't create view for frame\n");
        delete m_pScriptView;
        m_pScriptView = nullptr;
        return FALSE; 
    }

    m_pScriptView->SendMessage(WM_INITIALUPDATE, 0, 0);  // WM_INITIALUPDATE is defined in afxpriv.h
    pChild->RecalcLayout();
    m_pScriptView->UpdateWindow();
    pChild->SetActiveView(m_pScriptView);
    return TRUE;
}
您使用它的方式如下:

CRuntimeClass *pNewViewClass = RUNTIME_CLASS(CScriptParseView);
if (!SwitchToView(pNewViewClass))
{
    // fail, don't know why it would fail
    ASSERT(FALSE);
}

我会说我很久以前就做过类似的事情(使用vc++6.0),但我不确定这是否可能,它需要构建自定义的MFC库。在使用MFC时,要求序列化文档由磁盘文件支持一直是我的主要不满。我找到的解决方案是使用CMultiDocTemplate创建新文档,然后为该文档创建新框架。很久以前,我开发了一个具有多种文档和视图类型的MFC应用程序。基本上,每个doctype/viewtype组合都需要一个文档模板。如果要创建特定类型的视图窗口,则需要保留初始化期间创建的文档模板实例。至于使用从磁盘文件以外的源获取的数据创建文档,您需要深入挖掘MFC代码,检查可以更改的内容(如虚拟内容),如果不能更改,则编写自己的函数。检查CWinApp::OnFileNew和OnFileOpen的功能。重写或从此处获取代码段。您还可以根据文档类型将文档的视图切换到另一个视图。@ConstantineGeorgiou非常感谢您的回复。我会听从你的建议。我以前考虑过这个解决方案,但我一直在寻找是否有更简单的方法。