【问题标题】:Embedding dialogs in main dialog and switching them with button click in MFC在主对话框中嵌入对话框并通过在 MFC 中单击按钮来切换它们
【发布时间】:2014-05-10 21:55:16
【问题描述】:

我的设计如下:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • CFormView 可能是候选者。

标签: c++ winapi mfc dialog


【解决方案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);

【讨论】:

  • 如何将那些内部对话框放入正确的坐标中?
【解决方案2】:

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

例如,这个:

【讨论】:

    【解决方案3】:

    您可以做的是使用普通的 CDialog 类,向其中添加按钮,并创建一个框架/矩形作为嵌入对话框出现的占位符。以下代码将创建并定位您的嵌入式对话框。

    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 并隐藏选项卡行并以编程方式更改按钮单击时的选项卡。我只是觉得它在边界、定位、验证等方面太模糊了。

    【讨论】:

    • CWnd *pHost = GetDlgItem(ID_OF_YOUR_FRAME_RECT); 触发调试断言,因为 GetDlgItem(ID_OF_YOUR_FRAME_RECT) 返回 NULL,知道吗?
    • 确保你首先调用了 CDialog::OnInitDialog
    • ASSERT后面的cmets通常会说为什么触发,但是无论如何,这里把ASSERT声明贴出来
    • GetDlgItem() 函数内的这一行ASSERT(::IsWindow(m_hWnd)); 导致异常Unhandled exception at 0x510bcdac (mfc100ud.dll) in Demo.exe: 0xC0000005: Access violation reading location 0x00000020.
    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多