2011-02-24 14 views
7

Estoy escribiendo una DLL del complemento Win32 para una aplicación MFC de un tercero. La DLL necesita mostrar un diálogo modal. Cuando hago esto usando DialogBox() u otra API simple de Win32 (por ejemplo, traté de escribir mi propio bucle modal), la ventana de la aplicación principal no vuelve a dibujar todos los elementos: vuelve a dibujar los elementos estándar, pero no el área del cliente. Los diálogos sin formas se muestran bien.Aplicación MFC y un cuadro de diálogo modal que no es MFC

Screenshot

Sospecho que esto se debe a que MFC no tiene realmente diálogos modales en el sentido de Win32. Solo puede tener un bucle de mensaje y un bucle separado en DialogBox() interrumpe su delicada maquinaria. Aquí está a CodeProject article que explica esto. Pero este artículo de CodeProject tiene 9 años, así que tal vez las cosas hayan cambiado desde entonces. ¿Alguien podría arrojar algo de luz sobre esto? La aplicación utiliza MFC 8 (es decir, mfc80.dll).

Actualización. Aquí hay un enlace al original question; puede contener algo de información adicional.

Actualización 2. Gracias a todos; Realmente aprecio todos los consejos, sin duda me ayuda a tener una idea general de cómo encajan las cosas. La primera ruta que exploraré es usar diálogos nativos de MFC 'modal'. (Como hago todo esto desde Python, usaré enlaces de Python para MFC, pywin32). Esto tomará algún tiempo; cuando esté listo, actualizaré la publicación con los resultados.

+0

+1 buena pregunta, estaremos interesados ​​en ver la respuesta! –

+0

También vea http://stackoverflow.com/questions/5058929 de la cual esta pregunta es un seguimiento (más o menos). – 0xC0000022L

+0

podría usar Spy ++ (viene con Visual Studio) o alguna otra aplicación similar (una que conozco se puede encontrar en http://www.catch22.net/software/winspy) para averiguar si el área del cliente de la "Consola" "ventana es más que una sola ventana de niño ?! – 0xC0000022L

Respuesta

4

Cada hilo puede tener un bucle de mensaje. Coloque su diálogo modal en un hilo separado y emule el comportamiento estándar de Windows deshabilitando la ventana principal.

Editar: después de un debate (ver más abajo) parece que el código principal se comporta de forma incorrecta.

Aún así, creo que hay posibles soluciones. Uno podría ser una ventana primaria (para el diálogo modal, pero secundaria para el que actualmente se comporta incorrectamente) que se superpone al contenido erróneo de la ventana, pero lo vuelve a dibujar desde un DC en la memoria para imitar el comportamiento correcto. Por supuesto, la ventana padre todavía tendría que estar deshabilitada. Otra solución puede ser crear una subclase de la ventana principal para corregir el comportamiento. Dado que el complemento se ejecutará dentro del mismo proceso, la implementación debería ser sencilla.

+0

Es poco probable que funcione porque la aplicación de host llama a este complemento de forma síncrona. –

+0

@David Heffernan: Correcto, ¿en base a qué parte de la pregunta original? Además, no importa si la aplicación de host lo llama de forma síncrona, porque el complemento se puede escribir para bloquear en su llamada (como espera la aplicación de host) hasta que el hilo que contiene el ciclo de mensajes (y todo el trabajo de diálogo) finalice. – 0xC0000022L

+0

@STATUS basado en el hecho de que debe estar bloqueando en el bucle principal para que la aplicación principal no vuelva a dibujarse. –

Cuestiones relacionadas