2008-11-07 11 views
3

C++/CLI 인터페이스 레이어를 사용하여 기존 C++ MFC 응용 프로그램에 C# WPF 대화 상자를 추가하고 있습니다. 나는 모달에 문제가있는 것을 제외하고는 일을하고있다. 예 :MFC 및 WPF 믹싱 : 모달 대화 상자

  1. MFC 앱은 ShowDialog를 사용하여 WPF 대화 상자를 보여줍니다. 예상대로 작동합니다.
  2. 그 WPF 대화 상자는 DoModal을 사용하여 MFC 대화 상자를 표시합니다. WPF 대화 상자는 기본 C++ 응용 프로그램 뒤에 숨겨져 있으며 수동으로 IsEnabled를 변경하지 않으면 비활성화되지 않습니다. 이상적은 아니지만 작동합니다.
  3. 이제 MFC 대화 상자가 닫힙니다. 이제는 어떤 이유로 MFC 응용 프로그램이 활성화되어 있습니다. WPF 대화 상자가 닫히지 않아서 여전히 비활성화되어 있어야합니다. WPF 대화 상자가 아직 열려있을 때 사용자가 미친 짓을 할 수있게되어 나쁘다.

부모 대화 상자를 올바르게 설정할 수 있다면 좋을 것이라고 생각합니다. 그러나 지금까지는 MFC 대화 상자의 부모를 WPF 대화 상자로 설정하거나 그 반대로 설정할 수 없었습니다. 그리고 그게 고칠 수 있을지조차 모르겠다.

아이디어가 있으십니까?

답변

4

CDialog를 열 때 트릭은 WindowsInteropHelper를 사용하여 부모 WPF 대화 상자의 HWND를 가져 오는 것입니다. 그런 다음 CWnd :: Attach를 사용하여 CWnd 클래스의 HWND를 래핑하여 CDialog의 생성자에 전달할 수 있습니다.

내가 가진 문제는 이미 CDialog가 생성되었지만 아직 표시되지 않았다는 것입니다. SetParent의 다양한 버전은 대상 하위 창이 이미 유효한 핸들을 가지고있는 경우에만 사용할 수 있습니다. 내 CDialog 클래스에 m_wndParent를 설정하는 새로운 함수를 작성해야했습니다. m_wndParent는 마침내 대화 상자를 만들 때 부모로 사용하는 것입니다. 그러면 모든 것이 잘됩니다!

어떻게 든 MFC 대화 상자에서 WPF 대화 상자를 만드는 것은 "그냥 작동합니다". 그것은 마술입니다.

2

WPF 대화 상자를 표시 할 때 HwndSource class을 사용하여 WPF 창을 감싸십니까? 그렇다면 ::SetParent WPF 창뿐만 아니라 HwndSource.Handle 속성을 사용하여 하위 하위 부모를 설정할 수 있습니다.

+0

아니요. HwndSource를 사용하면 MFC/Win32 Window에 WPF 컨트롤을 포함하고자 할 때만 필요하다는 것을 알았습니다. 그것은 총을 가치가 있을지도 모른다. .. 내가 시험해 보았던 것에 관해 나는 편집을 더할 것이다 – Joe

+0

실제로, 당신은 아마 가까웠다. 나는 HwndSouce 비트에 초점을 맞추었고 놓친 :: SetParent. CWnd 포인터를 걸리는 CDialog :: SetParent 사용하려고 및 CWnd :: Attach 나를 위해 작동하지 않았습니다. 하지만 WindowInteropHelper WPF 측면에 대한 HWND 가져 오려면 사용할 수 있어야합니다 :: SetParent – Joe

+0

Dang 300 char limit. 나중에 이것을 시험해 보겠습니다. 아마 월요일에 일하게 될 것입니다. – Joe