Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 多窗口同一文档_Windows_View_Mfc - Fatal编程技术网

Windows 多窗口同一文档

Windows 多窗口同一文档,windows,view,mfc,Windows,View,Mfc,我有一个SDI MFC应用程序,它的CMainFrame类是从CFrameWndEx派生的。 应用程序使用CSingleDocument模板连接文档/视图/框架 我需要有另一个窗口,其中包含与主窗口视图的同一文档相关的视图内容。 将CMInframe的另一个实例作为辅助窗口是否正确?您是否考虑过在窗口中添加其他实例?这篇文章涵盖了这一点,并提供了详细信息的链接。通过一些方法,我找到了一个解决方案: 第一: 在应用程序上有两个CMainFrame实例,其中第二个实例有一个布尔字段来指示它是一个或另

我有一个SDI MFC应用程序,它的CMainFrame类是从CFrameWndEx派生的。 应用程序使用CSingleDocument模板连接文档/视图/框架

我需要有另一个窗口,其中包含与主窗口视图的同一文档相关的视图内容。
将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);