Как использовать архитектуру Document / View в MFC - PullRequest
4 голосов
/ 09 мая 2011

Я все еще работаю над программой сбора данных в MFC и зацикливаюсь на работе с архитектурой Document / View. По сути, я хочу, чтобы у моего приложения было несколько окон. Один используется для показа видео, записанного с высокоскоростной камеры, другой имеет график, отображающий данные из системы DAQ, и, возможно, другой имеет элементы управления для настройки камеры и DAQ и т. Д.

Итак, на самом деле у меня много немодальных окон, каждое из которых отображает часть данных, обычно из другого источника. Теперь, работая с мастером приложений, я путаюсь с документами Doc / View, и хотя я могу его отключить, он технически не отключен. Теперь, кроме этого, я попытался открыть немодальные диалоги и FormViews безуспешно. В основном я просто не могу понять, как открыть новый вид, документация не очень полезна. Мне удалось открыть диалоговое окно «Модальное построение» из команды «Кнопка ленты», и я отмечаю это как успех, но не совсем то, что мне нужно.

Итак, кто-нибудь может подсказать, как адаптировать мое приложение к архитектуре Doc / View или открыть немодальное диалоговое окно или FormView из другого приложения. Я должен сказать, что я использую Microsoft Visual Studio 2010, и я использую MFC и C ++.

EDIT:

Итак, я пошел с 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 Ответ

3 голосов
/ 09 мая 2011

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

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

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

...