你可以做的是使用一个普通的CDialog类,添加你的按钮,并创建一个frame/rect作为占位符,用于显示嵌入式对话框的位置.以下代码将创建和定位嵌入式对话框.
CRect rect;
CWnd *pHost = GetDlgItem(ID_OF_YOUR_FRAME_RECT);
pHost->GetWindowRect(&rect);
ScreenToClient(&rect);
pDialog->Create(ID_OF_YOUR_DIALOG, this);
pDialog->MoveWindow(&rect);
pDialog->ShowWindow(SW_SHOW);
Run Code Online (Sandbox Code Playgroud)
在按钮单击时,隐藏先前显示的对话框(SW_HIDE)并使用ShowWindow(...)显示所选对话框(SW_SHOW).
如果在添加资源编辑器中使用IDD_FORMVIEW样式创建嵌入式对话框,则它将具有适当的嵌入样式.
另一种选择可能是使用嵌入的PropertySheet并隐藏选项卡行并以编程方式更改按钮单击上的选项卡.我发现它对于边框,定位,验证以及我喜欢的内容都太过模糊了.
仅使用基于对话框的应用程序对我有用的是 SetParent() 方法。不知道为什么没人提到它。看起来效果很好。我正在这样做:
VERIFY(pDlg1.Create(PanelDlg::IDD, this));
VERIFY(pDlg2.Create(PanelDlg2::IDD, this));
VERIFY(pDlg3.Create(PanelDlg2::IDD, this));
::SetParent(pDlg1.GetSafeHwnd(), this->m_hWnd);
::SetParent(pDlg2.GetSafeHwnd(), this->m_hWnd);
::SetParent(pDlg3.GetSafeHwnd(), this->m_hWnd);
Run Code Online (Sandbox Code Playgroud)
现在我可以随意显示或隐藏子对话框(单击按钮),如下所示:
pDlg1.ShowWindow(SW_SHOW);
pDlg2.ShowWindow(SW_HIDE);
pDlg3.ShowWindow(SW_HIDE);
Run Code Online (Sandbox Code Playgroud)