如何将MFC无模式对话框更改为MDI应用程序中CView的子级?

如何将MFC无模式对话框更改为MDI应用程序中CView的子级?,mfc,mdi,modeless,Mfc,Mdi,Modeless,我有一个MFC应用程序,它是一个文档/视图/框架实现。一个对话框以无模式对话框的形式运行,可根据需要(从菜单选项)弹出。我希望将无模式对话框添加到MDI子视图中。基本上,我希望从资源文件加载模板,并将其作为CView的子级创建在我要添加到MDI模板列表的新trio(doc/view/frame)中 我在派生的CMyView类中尝试了一些方法: void CMyView::OnInitialUpdate() { m_ListDialog = new Dialogs::CListDialog(

我有一个MFC应用程序,它是一个文档/视图/框架实现。一个对话框以无模式对话框的形式运行,可根据需要(从菜单选项)弹出。我希望将无模式对话框添加到MDI子视图中。基本上,我希望从资源文件加载模板,并将其作为CView的子级创建在我要添加到MDI模板列表的新trio(doc/view/frame)中

我在派生的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时,ListDialog的m_hWnd都保留为0。这说明它没有被正确创建。任何对SetWindowPos()或ShowWindow()的调用都会失败,因为m_hWnd为0(调试断言失败)

我需要做什么才能在MDI应用程序中构造、创建无模式对话框,并将其作为CMyView的子对象显示

我不知道。但是…
根据应用程序的外观,您可以选择几个合适的选项

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);
}

使用CFormView而不是CDialog。经过调查,可能是“自定义控件”阻止了它的工作。这在测试应用程序中确实起作用,但只有在我修改了资源编辑器中的对话框以将样式属性更改为“Child”而不是“Popup”时才起作用。