3

C++/CLI インターフェイス レイヤーを使用して、既存の C++ MFC アプリに C# WPF ダイアログを追加しています。モダリティに問題があることを除けば、私はうまくいっています。例えば:

  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 のさまざまなバージョンは、ターゲットの子ウィンドウに有効なハンドルが既にある場合にのみ使用できます。最終的にダイアログを作成するときに親として使用する m_wndParent を設定するために、CDialog クラスに新しい関数を作成する必要がありました。その後、すべてがうまくいきます!

どういうわけか、MFC ダイアログから WPF ダイアログを作成すると、「うまくいきます」。魔法です。

于 2008-11-16T16:21:56.440 に答える
2

WPF ダイアログを表示するとき、HwndSource クラスを使用して WPF ウィンドウをラップしていますか? その場合は、WPF ウィンドウを::SetParentするだけでなく、HwndSource.Handle プロパティを使用してサブ子の親を設定できる場合があります。

于 2008-11-08T01:09:43.327 に答える