Question

J'ajoute des boîtes de dialogue WPF C # à une application C ++ MFC existante, à l'aide d'une couche d'interface C ++ / CLI. J'ai des choses qui fonctionnent, sauf que j'ai un problème de modalité. Par exemple:

  1. L'application MFC affiche une boîte de dialogue WPF utilisant ShowDialog. Fonctionne comme prévu.
  2. Cette boîte de dialogue WPF affiche une boîte de dialogue MFC utilisant DoModal. La boîte de dialogue WPF est masquée derrière l'application C ++ de base et n'est désactivée que si je modifie manuellement IsEnabled. Pas idéal, mais ça marche.
  3. Cette boîte de dialogue MFC est maintenant fermée. Maintenant, pour une raison quelconque, l'application MFC de base est activée, alors qu'elle devrait l'être encore car la boîte de dialogue WPF n'a pas été fermée. C'est dommage, car cela permet maintenant à l'utilisateur de faire des choses folles alors que la boîte de dialogue WPF est toujours ouverte.

J'ai l'impression que cela fonctionnerait mieux si je pouvais définir correctement les dialogues des parents. Mais jusqu'à présent, je n'ai pas pu définir le parent d'un dialogue MFC en tant que dialogue WPF, ou inversement. Et je ne sais même pas si cela réglerait le problème.

Des idées?

Était-ce utile?

La solution

Lors de l'ouverture d'un CDialog, l'astuce consiste à utiliser WindowsInteropHelper pour obtenir le HWND de la boîte de dialogue WPF parent. Ensuite, vous pouvez utiliser CWnd :: Attach pour encapsuler ce HWND dans une classe CWnd à transmettre au constructeur de CDialog.

Le problème que j’avais était que j’avais déjà construit le CDialog., mais pas encore affiché. Les différentes versions de SetParent ne peuvent être utilisées que si votre fenêtre enfant cible a déjà un descripteur valide. J'ai dû écrire une nouvelle fonction dans ma classe CDialog pour définir m_wndParent, qui est ce qu'elle utilise comme parent quand il crée finalement le dialogue. Ensuite, tout fonctionne bien!

D'une certaine manière, créer des boîtes de dialogue WPF à partir de boîtes de dialogue MFC "ne fonctionne que". C'est magique.

Autres conseils

Lorsque vous affichez la boîte de dialogue WPF, utilisez-vous la la classe HwndSource pour envelopper la fenêtre WPF? Dans ce cas, vous pourrez peut-être :: SetParent la fenêtre WPF ainsi que la propriété HwndSource.Handle pour définir le parent du sous-enfant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top