Как изменить немодальный диалог MFC, чтобы он был дочерним для CView в приложении MDI?

StackOverflow https://stackoverflow.com/questions/2545517

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня есть приложение 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top