Как изменить немодальный диалог MFC, чтобы он был дочерним для CView в приложении MDI?
Вопрос
У меня есть приложение MFC, которое представляет собой реализацию Doc / View / Frame.Одно диалоговое окно выполняется как немодальное диалоговое окно, которое появляется по требованию (из пункта меню).Я хочу добавить немодальный диалог в дочерний вид MDI.По сути, я хочу загрузить шаблон из файла ресурсов и создать его как дочерний элемент CView в моем новом трио (doc / view / frame), которое я добавляю в списки шаблонов для MDI.
Я попробовал несколько вещей в моем производном классе CMyView:
void CMyView::OnInitialUpdate()
{
m_ListDialog = new Dialogs::CListDialog( m_config, this );
m_ListDialog->Create( Dialogs::CListDialog::IDD, this );
m_ListDialog->ShowWindow( SW_SHOW );
}
Я попытался вызвать SetWindowPos, ModifyStyle (WS_CHILD, WS_VISIBLE, DS_CONTROL).Я попытался изменить файл ресурсов, чтобы установить дочерний элемент и управление вручную.
Каждый раз, когда он вызывает Create, m_hWnd для ListDialog остается равным 0.Это говорит мне о том, что он создается неправильно.Любой вызов SetWindowPos() или ShowWindow() завершается с ошибкой, поскольку m_hWnd равно 0 (ошибка утверждения отладки).
Что мне нужно сделать, чтобы создать немодальный диалог, который будет создан и отображаться как дочерний для CMyView в моем MDI-приложении?
Решение
Я не знаю.Но...
У вас есть несколько альтернативных вариантов, которые могут подойти в зависимости от того, как должно выглядеть ваше приложение.
1/использование CFormView
.Если ваше представление предназначено для диалогового окна, то вы можете получить представление из класса MFC CFormView.Цель этого представления - отобразить диалоговое окно.
Просто создайте новое приложение с помощью мастера, и я думаю, вы сможете выбрать класс CFormView в качестве своего класса просмотра, а затем скопировать сгенерированный файл в ваше существующее приложение.
2/ Использование CSplitterWnd
.Одно представление является CFormView, а другое - вашим текущим CView.
3/ использование CDialogBar
Если в вашем представлении что-то уже отображается, вы можете добавить свой диалог в качестве панели инструментов, используя класс CDialogBar.
Другие советы
это работает в моем приложении MDI...
void CGUIView::OnInitialUpdate()
{
CView::OnInitialUpdate();
p_Dlg = new CTestDlg; // a CDialog derived class
p_Dlg->Create(IDD_DIALOG1,this);
p_Dlg->ShowWindow(SW_SHOW);
}