Windows 多窗口同一文档
我有一个SDI MFC应用程序,它的CMainFrame类是从CFrameWndEx派生的。 应用程序使用CSingleDocument模板连接文档/视图/框架 我需要有另一个窗口,其中包含与主窗口视图的同一文档相关的视图内容。Windows 多窗口同一文档,windows,view,mfc,Windows,View,Mfc,我有一个SDI MFC应用程序,它的CMainFrame类是从CFrameWndEx派生的。 应用程序使用CSingleDocument模板连接文档/视图/框架 我需要有另一个窗口,其中包含与主窗口视图的同一文档相关的视图内容。 将CMInframe的另一个实例作为辅助窗口是否正确?您是否考虑过在窗口中添加其他实例?这篇文章涵盖了这一点,并提供了详细信息的链接。通过一些方法,我找到了一个解决方案: 第一: 在应用程序上有两个CMainFrame实例,其中第二个实例有一个布尔字段来指示它是一个或另
将CMInframe的另一个实例作为辅助窗口是否正确?您是否考虑过在窗口中添加其他实例?这篇文章涵盖了这一点,并提供了详细信息的链接。通过一些方法,我找到了一个解决方案: 第一: 在应用程序上有两个CMainFrame实例,其中第二个实例有一个布尔字段来指示它是一个或另一个。这个布尔值允许我只在第二次创建时跳过Everything创建,因为我只希望它是一个带有视图的矩形。我添加了一个特殊的公共构造函数,它总是将引用的布尔值设置为true
CMainFrame *pSecondFrame = new CMainFrame(TRUE /*dumb*/);
它起作用了,但速度很慢。由于速度不够,第一台大型机的视图完全无法使用
第二:
有一个CSecondFrame,它也是从CFrameWndEx派生的,并且它的主体上几乎没有任何内容。由于IDR_MAINFRAME没有任何功能,我可以期望执行LoadFrame(IDR_MAINFRAME),并且在应用程序上有一个几乎为空的框架
CSecondFrame *pSecondFrame = new CSecondFrame();
它起作用了,但速度很慢。由于速度不够,第一台大型机的视图完全无法使用
对于第一种和第二种方法,我必须添加一个新的CreateContext,因为我不能重用mainframe视图:
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尝试了不同的方法:NULL、CMainFrame、CSecondFrame。每次我得到一个框架,这是主要的碳拷贝,我不想要这个
对于CMainFrame和CSecondFrame,我试图明确地调用它们的Create(…)函数,但失败了,因此它们甚至没有传递OnCreate(…)方法。
除此之外,我还尝试为这两种情况使用LoadFrame(IDR_大型机)。现在我将有三个框架:主框架,第二个框架,是主框架的复写副本,以及用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);
用于使窗口可见。否,因为我确实需要两个单独的窗口。顺便说一句,我已经看到了So主题和其中的codeguru主题。不是我想要的。塞吉奥,如果你删除你的帖子,它将不再公开。只有您和10ks以及版主才能看到它。@NullUserException:我仍然看到它,您的评论解释了为什么我看到它变灰并带有取消删除选项。难道没有“永远删除”选项吗?
pSecondFrame->ShowWindow(SW_SHOW);