【问题标题】:How to use the Document/View architecture in MFC如何在 MFC 中使用文档/视图体系结构
【发布时间】:2011-08-21 06:56:45
【问题描述】:

我仍在使用 MFC 中的数据采集程序,并且在使用文档/视图架构时遇到了困难。基本上,我希望我的应用程序有几个窗口。一个用于显示从高速摄像机记录的视频,另一个用于显示来自 DAQ 系统的数据的绘图,还有一个用于配置摄像机和 DAQ 等的控件。

所以,实际上我有很多无模式窗口,每个窗口都显示部分数据,通常来自不同的来源。现在,通过并使用应用程序向导,我对 Doc/View 的东西感到困惑,即使我可以将其关闭,但从技术上讲它并没有关闭。现在除此之外,我尝试打开无模式对话框和 FormViews 都没有成功。大多数情况下,我只是不知道如何打开新视图,文档并没有真正的帮助。我已经能够从功能区按钮命令打开模态绘图对话框,我将其标记为成功,但不完全是我需要的。

那么,是否有人对将我的应用程序适合 Doc/View 架构或从另一个应用程序中打开无模式对话框或 FormView 有有用的见解。我应该说我使用的是 Microsoft Visual Studio 2010,并且我使用的是 MFC 和 C++。

编辑:

所以,我选择了 MDI,并且将有一个文档来处理要显示的所有数据。我现在坚持的是如何创建我想要的多个窗口。我将 CFormView 子类化为文档的图形视图,并且在单击菜单按钮时尝试创建该窗口。我可以使用模态对话框来做到这一点,如下所示:

void CDAQUniversalApp::OnScopebtn()
{
    // TODO: Add your command handler code here
    CScopeDlg dlg = new CScopeDlg(); //CScopeDlg is Subclass of CDialog
    dlg.DoModal();
}

这行得通,但不是我想要的,所以我尝试了这个,但它根本不起作用:

    m_pScopeTemplate = new CMultiDocTemplate(
        IDD_SCOPEFORMVIEW,
        RUNTIME_CLASS(CDAQUniversalDoc),
        RUNTIME_CLASS(CMDIChildWnd),
        RUNTIME_CLASS(CScopeFormView)); //Subclass of CFormView
    if (!m_pScopeTemplate)
        return FALSE;

void CDAQUniversalApp::OnScopebtn()
{
    // TODO: Add your command handler code here
    CMDIChildWnd* pFrame = NULL;
    pFrame = DYNAMIC_DOWNCAST(CMDIChildWnd, CWnd::GetActiveWindow());
    CMDIChildWnd *pScopeFrame = (CMDIChildWnd*)m_pScopeTemplate->CreateNewFrame(pFrame->GetActiveDocument(), NULL);
    if (pScopeFrame == NULL)
        return;
    m_pScopeTemplate->InitialUpdateFrame(pScopeFrame, pFrame->GetActiveDocument(), TRUE);

}

这只会导致未处理的异常。我真的只是用蛮力找到了文档代码中各种无用的部分,然后将其修改为我认为需要的内容。

【问题讨论】:

    标签: c++ visual-studio-2010 mfc document-view


    【解决方案1】:

    您的不同窗口(用于视频显示、数据显示和配置)实际上是单个文档的所有视图(不同视图类),用于管理数据(假设 DAQ 处理视频数据?)。

    我建议你将你的应用程序打包到一个 MDI 应用程序中,这样就有一个主窗口,所有这些不同的视图都作为子窗口。因此,您可以为单个文档(甚至 MDI 中的多个文档)提供多个视图。

    如果您的应用程序不适合经典的文档/视图架构(例如 Word),MFC 可能会很痛苦,但我认为这是让您的应用程序适合该框架的最佳方式。

    【讨论】:

    • 嗯,它的工作原理是最多有三种不同的信息来源,Camera 是 firewire (C++ lib),DAQ 是 pcicard (C lib),还有一个串口,所有不同的信息同时获得。但 MDI 听起来确实很有意义。我假设 Document 会从所有来源获取数据,并且每个 View 都会显示每个特定数据。我还没有找到关于这种交互如何工作或如何编写它的良好资源,您是否有关于如何做到这一点的见解或好的示例/教程/书籍?
    • @Nate 我已经很久没有使用 MFC(现在使用 Qt)了。我通过“使用 MFC 编程 Windows”一书了解到,这是标准资源,但它的重量很重,而且不容易找到/支付(我很幸运能以合理的成本获得它)。我不再那么适合 MFC(我也不想这样,因为与 Qt 等设计简洁且灵活的 API 相比,这真的很痛苦)
    • 谢谢,我一定会看看那个。我一直在做 MFC 只是因为它带有 Visual Studio,我认为我使用的库是为 VC++ 设计的,但是我对 C++ 一点也不熟悉。
    • @Nate,视频窗口、情节和控件如何相互关联?是一个视频和几个情节还是一个视频和一个情节?对于 Doc/View,我们假设有一个包含数据的文档和几个对该数据的视图。例如,我们可以有一个描述电影的文档和几个视图,例如预告片窗口、IMDB 窗口、wiki 条目等。但在尝试 MFC 之前,您必须熟悉 C++。
    • @Agnel,理想情况下,该文档将控制 DAQ 软件和摄像头,因此它将具有要绘制的数据和视频文件。视频窗口将显示视频,视频控制窗口将调整播放和设置参数,另一个窗口将在文档中绘制数据,另一个视图将控制从哪些通道获取数据,扫描速率等。我已经得到C++ 的窍门,足够了解 C,并且熟悉 Python 的 OOP,所以我开始将结构拼凑在一起。我现在已经能够将我的询问细化为一个特定的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2014-10-16
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多