Как использовать архитектуру 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), но я думаю, что это будет наилучшим способом вписать ваше приложение в эту среду.