Как использовать архитектуру Document/View в MFC

Я все еще работаю над программой сбора данных в MFC и застреваю, работая с архитектурой Document/View. По сути, я хочу, чтобы у моего приложения было несколько окон. Один используется для показа видео, записанного с высокоскоростной камеры, другой имеет график, отображающий данные из системы 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);

}

Это просто вызывает необработанное исключение. Я на самом деле просто перебил свой путь к этому моменту, находя различные в значительной степени бесполезные разделы кода документации и модифицируя его так, как мне кажется, мне нужно.

1 ответ

Решение

Ваши разные окна (для отображения видео, отображения данных и конфигурации) - это фактически все представления (разные классы представлений) для одного документа, который управляет данными (при условии, что DAQ работает с видеоданными?).

Я предлагаю вам упаковать ваше приложение в MDI-приложение, таким образом, имея главное окно со всеми этими различными представлениями как подокна. Таким образом, у вас есть несколько представлений для одного документа (или даже нескольких документов в MDI).

MFC может быть проблемой, если ваше приложение не соответствует классической архитектуре документа / представления (как, например, Word), но я думаю, что это будет наилучшим способом вписать ваше приложение в эту среду.

Другие вопросы по тегам