如何在另一个 CDialog 中显示嵌套的 CDialog?
How can I display a nested CDialog within another CDialog?
我创建了两个 CDialog 类。我们称它们为 MainDialog 和 ExtraDialog。我希望 ExtraDialog 既可以通过 doModal 显示,也可以作为 MainDialog 中的嵌套对话框显示。
我已经可以通过 Button 和 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);
上面我分享了一些我尝试过的东西。我希望创建一个 CWnd 并将对话框放在 CWnd 中,但我觉得我遗漏了一些东西,而且我在网上找不到任何有用的东西。
编辑:我基本上是在尝试将多个 CWnd 放入一个 CDialog,并使 CWnd 的 运行 来自不同 类 的不同功能。有点像拼乐高积木。
Edit2:我发现了一个有点相似的问题?我希望使它相似,但我只是不想要按钮,我希望它们中的两个同时显示。 Embedding dialogs in main dialog and switching them with button click in MFC
I've been stuck about how to place it within MainDialog.
至少删除 WS_POPUP
、WS_CAPTION
和 WS_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 );
I was hoping to create a CWnd and put the dialog inside the CWnd
我建议始终使用 CDialog
派生的 class 作为嵌入式对话框的父级。这确保了与 Windows 对话框管理器的最佳兼容性,以实现标准键盘导航等功能。您将与系统一起工作,而不是反对它。
更多阅读:
我创建了两个 CDialog 类。我们称它们为 MainDialog 和 ExtraDialog。我希望 ExtraDialog 既可以通过 doModal 显示,也可以作为 MainDialog 中的嵌套对话框显示。
我已经可以通过 Button 和 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);
上面我分享了一些我尝试过的东西。我希望创建一个 CWnd 并将对话框放在 CWnd 中,但我觉得我遗漏了一些东西,而且我在网上找不到任何有用的东西。
编辑:我基本上是在尝试将多个 CWnd 放入一个 CDialog,并使 CWnd 的 运行 来自不同 类 的不同功能。有点像拼乐高积木。
Edit2:我发现了一个有点相似的问题?我希望使它相似,但我只是不想要按钮,我希望它们中的两个同时显示。 Embedding dialogs in main dialog and switching them with button click in MFC
I've been stuck about how to place it within MainDialog.
至少删除 WS_POPUP
、WS_CAPTION
和 WS_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 );
I was hoping to create a CWnd and put the dialog inside the CWnd
我建议始终使用 CDialog
派生的 class 作为嵌入式对话框的父级。这确保了与 Windows 对话框管理器的最佳兼容性,以实现标准键盘导航等功能。您将与系统一起工作,而不是反对它。
更多阅读: