Mfc多个窗口相同的文件

时间:2011-12-13 10:45:18

标签: windows view mfc

我有一个SDI MFC应用程序,CMainFrame类派生自CFrameWndEx。 该应用程序使用CSingleDocument模板连接Document / View / Frame。

我需要另一个窗口,其中包含与主窗口视图的同一文档相关的视图内容。 将另一个CMainFrame实例作为辅助窗口是否正确?

2 个答案:

答案 0 :(得分:2)

经过一些方法后,我找到了解决方案:

第一名:

在App上有两个CMainFrame实例,其中第二个有一个布尔字段,表示它是一个或另一个。这个布尔值允许我仅在第二个跳过创建everthing创建,因为我只希望它是一个带有视图的矩形。我已经向CMainFrame添加了一个特殊的公共构造函数,它始终将引用的布尔值设置为true。

    CMainFrame *pSecondFrame = new CMainFrame(TRUE /*dumb*/);

虽然有效,但速度很慢。由于缺乏速度,第一个MainFrame的视图完全无法使用。

第二名:

拥有一个CSecondFrame,它也是从CFrameWndEx派生出来的,并且几乎没有任何内容。由于IDR_MAINFRAME没有任何内容,我可以期待在应用程序上执行LoadFrame(IDR_MAINFRAME)并且几乎为空。

    CSecondFrame *pSecondFrame = new CSecondFrame();

虽然有效,但速度很慢。由于缺乏速度,第一个MainFrame的视图完全无法使用。

对于第一种和第二种方法,我不得不添加一个新的CreateContext,因为我无法重用大型机视图:

if (!pSecondFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;

CMainFrame* pMainFrame=(CMainFrame*)::AfxGetMainWnd();
if (!pMainFrame)
        return FALSE;

CMyView* pView=(CMyView*)(pMainFrame->GetActiveView());
if (!pView)
    return FALSE;

CCreateContext context;

context.m_pCurrentDoc=pMainFrame->GetActiveDocument();
context.m_pNewViewClass= RUNTIME_CLASS(CMyView);
context.m_pLastView= pView;
context.m_pCurrentFrame = pSecondFrame;

pSecondFrame->CreateView(&context);

第三

在InitInstance函数的开头,我有文档模板:

所以让我们玩它的CreateNewFrame方法:         POSITION pos = pDocTemplate-> GetFirstDocPosition();

            //pFrameTemp attribution

    CFrameWnd* pSecondFrame= pDocTemplate->CreateNewFrame(pDocTemplate->GetNextDoc(pos),pFrameTemp);

我为pFrameTemp尝试了不同的东西:NULL,CMainFrame,CSecondFrame。每次我得到一个主要的碳复制框架,我不想要这个。

对于CMainFrame和CSecondFrame情况,我试图明确地调用它们的Create(...)函数,这些函数失败了,所以它们甚至都没有传递它们的OnCreate(...)方法。 取而代之的是,我还尝试为两种情况做一个LoadFrame(IDR_MAINFRAME)。现在我将有三个框架:Main,第二个,它是main的carbon-copy,以及使用LoadFrame创建的框架,它完全是空白的。

第四: 在看到CreateNewFrame方法基于它在模板上的框架而不是在其参数中传递的框架创建新框架后,我决定尝试创建另一个模板:

CSingleDocTemplate* pSecondDocTemplate;
pSecondDocTemplate2 = new CSingleDocTemplate(
    MenuID,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CSecondFrame),//only the frame differs
    RUNTIME_CLASS(CMyView));
AddDocTemplate(pSecondDocTemplate);

POSITION pos= pDocTemplate->GetFirstDocPosition();
CFrameWnd* pSecondFrame=pSecondDocTemplate->CreateNewFrame(pDocTemplate->GetNextDoc(pos), NULL);

请注意,我将第一个模板的doc作为参数而不是第二个给CreateNewFrame。 这是我测试的唯一可行的解​​决方案,并不会减慢视图中的操作。

对于我提出的每个解决方案,似乎我都需要

 pSecondFrame->ShowWindow(SW_SHOW);

让窗口可见。

答案 1 :(得分:0)

您是否考虑在CView窗口中添加其他splitter?这个SO topic涵盖了它,并提供了详细信息的链接。