在主对话框中嵌入对话框,并在MFC中单击按钮切换它们

时间:2014-03-31 14:01:45

标签: c++ winapi mfc dialog

我的设计如下:

enter image description here

所以基本上,我想在应用程序主对话框中嵌入三个对话框并在它们之间切换,对于每个按钮单击即,按钮1将显示对话框1,按钮2将隐藏对话框1并显示对话框2 ...等等。 每个对话框都有不同的设计和功能。

我尝试使用CPropertySheet类添加页面但其GUI不同。它具有使用下一个/后退按钮或选项卡控件导航对话框的选项。 根据我的要求,这些都不是。

所以我想知道在MFC中有可能有这样的设计吗?如果有,怎么样?我应该使用哪个类/控件。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:7)

您可以使用普通的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);

在按钮单击时,隐藏先前显示的对话框(SW_HIDE)并使用ShowWindow(...)显示所选对话框(SW_SHOW)。

如果在添加资源编辑器中使用IDD_FORMVIEW样式创建嵌入式对话框,则它将具有适当的嵌入样式。

另一种选择可能是使用嵌入的PropertySheet并隐藏选项卡行并以编程方式更改按钮单击上的选项卡。我发现它对于边框,定位,验证以及我喜欢的内容都太过模糊了。

答案 1 :(得分:4)

如果你有MFC功能包,它首先附带VS2008 SP1,并且在所有更高版本中,你可能会考虑CMFCPropertySheet。链接页面上有许多示例,与您的设计非常相似。

例如,这个:

example 1

答案 2 :(得分:1)

使用基于对话框的应用程序对我有用的是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);

现在,我可以随意显示或隐藏子对话框(按钮点击),如下所示:

   pDlg1.ShowWindow(SW_SHOW);
   pDlg2.ShowWindow(SW_HIDE);
   pDlg3.ShowWindow(SW_HIDE);