【问题标题】:Mixing MFC and WPF: Modal Dialogs混合 MFC 和 WPF:模态对话框
【发布时间】:2010-09-21 08:35:15
【问题描述】:

我正在使用 C++/CLI 接口层将 C# WPF 对话框添加到现有 C++ MFC 应用程序。我有一些工作,除了我的方式有问题。例如:

  1. MFC 应用程序使用 ShowDialog 显示 WPF 对话框。按预期工作。
  2. 该 WPF 对话框显示了一个使用 DoModal 的 MFC 对话框。 WPF 对话框隐藏在基本 C++ 应用程序后面,除非我手动更改 IsEnabled,否则它不会被禁用。不理想,但可以。
  3. 现在,该 MFC 对话框已关闭。现在由于某种原因,基本 MFC 应用程序已启用,但由于 WPF 对话框尚未关闭,它仍应被禁用。这很糟糕,因为它现在允许用户在 WPF 对话框仍然打开时做一些疯狂的事情。

我有一种感觉,如果我能正确设置父对话框,它会更好。但到目前为止,我还无法将 MFC 对话框的父级设置为 WPF 对话框,反之亦然。而且,我什至不知道这是否能解决问题。

有什么想法吗?

【问题讨论】:

    标签: wpf mfc c++-cli modal-dialog


    【解决方案1】:

    打开 CDialog 时,诀窍是使用 WindowsInteropHelper 获取父 WPF 对话框的 HWND。然后,您可以使用 CWnd::Attach 将该 HWND 包装在 CWnd 类中以传递给 CDialog 的构造函数。

    我遇到的问题是我已经构建了 CDialog。但尚未显示。仅当您的目标子窗口已经具有有效句柄时,才能使用各种版本的 SetParent。我必须在我的 CDialog 类中编写一个新函数来设置 m_wndParent,这是它最终创建对话框时用作父级的函数。然后一切正常!

    以某种方式从 MFC 对话框创建 WPF 对话框“正常工作”。很神奇。

    【讨论】:

      【解决方案2】:

      当显示 WPF 对话框时,您是否使用 HwndSource class 来包装 WPF 窗口?如果是这样,您也许可以::SetParent WPF 窗口以及使用 HwndSource.Handle 属性来设置子子项的父项。

      【讨论】:

      • 没有。我发现只有当我想在 MFC/Win32 窗口中嵌入 WPF 控件时才需要使用 HwndSource。不过可能值得一试...我将添加有关我所做尝试的编辑
      • 实际上,您可能已经接近了。我专注于 HwndSouce 位,错过了 ::SetParent。我试图使用 CDialog::SetParent,它需要一个 CWnd 指针,而 CWnd::Attach 对我不起作用。但是我应该能够使用 WindowInteropHelper 来获取 WPF 端的 HWND,并且只需使用 ::SetParent
      • 当 300 个字符限制。我稍后会测试一下 - 可能在星期一的工作中
      猜你喜欢
      • 2013-08-26
      • 2013-09-22
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多