如何在另一个CDialog中显示嵌套的CDialog



我有两个我创建的CDialog类。让我们称它们为Maindialog和外部。我希望通过Domodal和Maindialog中的嵌套对话框显示外部词。

我已经可以通过按钮和domodal分别启动它。但是,我一直对如何将其放置在Maindialog中。

CWnd* m_pWndStatic = new CWnd;
m_pWndStatic->Create(_T("Something"), _T("Title"), WS_CHILD | WS_VISIBLE, CRect(x, y, xEnd, yEnd), this, idWnd);
CExtraDialog* dlg = new CExtraDialog;
dlg->Create(IDD_NEW_DIALOG, this); //Or second variable can be m_pWndStatic?
//dlg->SetWindowPos(m_pWndStatic, x, y, xEnd, yEnd, SWP_NOZORDER | SWP_NOACTIVATE);
//dlg->Invalidate();
//dlg->ShowWindow(SW_SHOW);
//m_pWndStatic->ShowWindow(SW_SHOW);

上面我分享了我尝试过的一些thign。我希望创建一个CWND并将对话框放在CWND中,但我觉得我缺少一些东西,我真的找不到任何有帮助的在线。

编辑:我基本上试图将多个CWND放入一个CDialog中,并使CWND的运行不同类别的功能来自不同的类别。有点像将乐高积木放在一起。

edit2:我发现一个有点相似的问题?我希望能使它类似,但我只是不想要按钮,我希望其中两个立即显示。在主对话框中嵌入对话框,并使用按钮单击MFC

切换它们

我一直对如何将其放置在Maindialog中。

至少删除WS_POPUPWS_CAPTIONWS_SYSMENU样式。添加WS_CHILD样式。

强烈建议将WS_EX_CONTROLPARENT扩展样式添加以使键盘导航进入嵌入式对话框。

例如,在"父对话框"的OnInitDialog()中,您可以添加:

// Note: Create member variable CExtraDialog, so there is no need for dynamic allocation!
m_extraDlg.Create( IDD_NEW_DIALOG, this );
// Adjust styles. 1st parameter removes, 2nd adds.
m_extraDlg.ModifyStyle( WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME, WS_CHILD );
// Adjust extended styles. 1st parameter removes, 2nd adds.
m_extraDlg.ModifyStyleEx( WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE, WS_EX_CONTROLPARENT );
// As we have changed the frame, we let Windows recalculate the non-client area
// by passing the SWP_FRAMECHANGED flag to SetWindowPos().
m_extraDlg.SetWindowPos( nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | 
     SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE );

我希望创建一个CWND,然后将对话框放入CWND

我建议始终使用CDialog衍生的类作为嵌入式对话框的父。这确保了与标准键盘导航等功能的Windows对话框管理器的最佳兼容性。您将使用系统使用,而不是与该系统一起工作。

更多阅读:

  • 的ds_control样式是什么
  • 为什么Tab键无法在我标记为WS_TABSTOP的控件上工作?
  • 对话框管理器,第2部分:创建帧窗口

最新更新