4

我仍在使用 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);

}

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

4

1 回答 1

3

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

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

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

于 2011-05-08T22:01:05.837 回答