Pregunta

Estoy agregando cuadros de diálogo C # WPF a una aplicación C ++ MFC existente, usando una capa de interfaz C ++ / CLI. Tengo cosas que funcionan, excepto que tengo un problema con la modalidad. Por ejemplo:

  1. La aplicación MFC muestra un cuadro de diálogo WPF usando ShowDialog. Funciona como se esperaba.
  2. Ese cuadro de diálogo WPF muestra un cuadro de diálogo MFC con DoModal. El cuadro de diálogo WPF está oculto detrás de la aplicación C ++ base, y no está deshabilitado a menos que cambie manualmente IsEnabled. No es ideal, pero funciona.
  3. Ahora, ese cuadro de diálogo MFC está cerrado. Ahora, por alguna razón, la aplicación MFC base está habilitada, cuando aún debería deshabilitarse debido a que el diálogo WPF no se ha cerrado. Eso es malo, ya que ahora permite al usuario hacer locuras mientras el cuadro de diálogo WPF todavía está abierto.

Tengo la sensación de que funcionaría mejor si pudiera establecer los diálogos principales correctamente. Pero hasta ahora no he podido establecer un cuadro de diálogo principal de MFC como cuadro de diálogo WPF, o viceversa. Y ni siquiera sé si eso lo solucionaría.

¿Alguna idea?

¿Fue útil?

Solución

Al abrir un CDialog, el truco es usar un WindowsInteropHelper para obtener el HWND del cuadro de diálogo WPF principal. Luego, puede usar CWnd :: Attach para envolver ese HWND en una clase CWnd para pasar al constructor del CDialog.

El problema que tuve fue que ya tenía el CDialog construido., pero aún no se muestra. Las diversas versiones de SetParent solo se pueden usar si la ventana secundaria de destino ya tiene un identificador válido. Tuve que escribir una nueva función en mi clase CDialog para establecer m_wndParent, que es lo que usa como padre cuando finalmente crea el diálogo. ¡Entonces todo funciona muy bien!

De alguna manera, crear cuadros de diálogo WPF a partir de cuadros de diálogo MFC " simplemente funciona " ;. Es mágico.

Otros consejos

Al mostrar el cuadro de diálogo WPF, ¿está utilizando la clase HwndSource para ajustar la ventana de WPF? Si es así, puede :: SetParent la ventana WPF, así como usar la propiedad HwndSource.Handle para establecer el padre secundario del niño secundario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top