3

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

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

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

有任何想法吗?

4

2 回答 2

4

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

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

以某种方式从 MFC 对话框创建 WPF 对话框“正常工作”。这是魔法。

于 2008-11-16T16:21:56.440 回答
2

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

于 2008-11-08T01:09:43.327 回答