MFCとWPFの混合:モーダルダイアログ
-
07-07-2019 - |
質問
C ++ / CLIインターフェイスレイヤーを使用して、C#WPFダイアログを既存のC ++ MFCアプリに追加しています。モダリティに問題があることを除いて、私は物事が機能している。例:
- MFCアプリは、ShowDialogを使用してWPFダイアログを表示します。期待どおりに動作します。
- そのWPFダイアログは、DoModalを使用したMFCダイアログを示しています。 WPFダイアログはベースC ++アプリの背後に隠れており、IsEnabledを手動で変更しない限り無効になりません。理想的ではありませんが、動作します。
- 今、そのMFCダイアログは閉じています。これで、何らかの理由でベースMFCアプリが有効になりますが、WPFダイアログが閉じられていないために無効にする必要があります。 WPFダイアログがまだ開いている間にユーザーがクレイジーなことを行えるようになったため、これは悪いことです。
親ダイアログを正しく設定できればもっとうまくいくと思う。しかし、これまでのところ、MFCダイアログの親をWPFダイアログとして設定することはできませんでした。そして、それがそれを修正するかどうかさえ知りません。
アイデアはありますか
解決
CDialogを開くときの秘theは、WindowsInteropHelperを使用して親WPFダイアログのHWNDを取得することです。次に、CWnd :: Attachを使用して、そのHWNDをCWndクラスにラップして、CDialogのコンストラクターに渡すことができます。
私が抱えていた問題は、すでにCDialogを構築していたことですが、まだ表示されていませんでした。 SetParentのさまざまなバージョンは、ターゲットの子ウィンドウに既に有効なハンドルがある場合にのみ使用できます。 CDialogクラスに新しい関数を作成してm_wndParentを設定する必要がありました。これは、最終的にダイアログを作成するときに親として使用するものです。その後、すべてがうまくいきます!
MFCダイアログからWPFダイアログを作成する方法は、「うまくいく」だけです。魔法です。
他のヒント
WPFダイアログを表示するときに、 HwndSource WPFウィンドウをラップしますか?その場合、 :: SetParent WPFウィンドウ、およびHwndSource.Handleプロパティを使用してサブ子の親を設定します。
所属していません StackOverflow