2009-08-04 26 views
8

Tengo un cuadro de diálogo (clase derivada de CDialog) que se puede usar de dos maneras diferentes (modo de edición y modo de programación).Convierta un cuadro de diálogo no modal a modal en tiempo de ejecución

Cuando el cuadro de diálogo está abierto para ser utilizado en el modo de programación, se trata de un cuadro de diálogo no modal que se utiliza para modificar la vista principal (tipo de barra de herramientas). Cuando está abierto en modo de edición, el usuario puede cambiar la configuración del cuadro de diálogo y, en este caso, es un cuadro de diálogo modal.

En este momento son dos cuadros de diálogo diferentes con algunas diferencias y me gustaría simplemente tener diálogo y permitir al usuario cambiar entre el modo de programación y el modo de edición simplemente presionando un botón en el cuadro de diálogo.

Por lo tanto, necesito convertir el cuadro de diálogo no modal en un diálogo modal y viceversa en el tiempo de ejecución. ¿Hay alguna forma de lograr eso?

Gracias.

Respuesta

11

Como tal vez alguien podría estar interesado en hacer algo similar en el futuro, esta es la forma en que finalmente hice:

utilizo estas dos funciones del marco principal: CMainFrame::BeginModalState() y CMainFrame::EndModalState().

El problema con estas funciones es el mismo que con la desactivación de la ventana principal. La ventana que desea hacer modal también se desactiva. Pero la solución es fácil, simplemente vuelva a habilitar la ventana después de llamar al BeginModalState.

void CMyDialog::MakeModal() 
{ 
    //disable all main window descendants 
    AfxGetMainWnd()->BeginModalState(); 

    //re-enable this window 
    EnableWindow(TRUE); 
} 

void CMyDialog::MakeModeless() 
{ 
    //enable all main window descendants 
    AfxGetMainWnd()->EndModalState(); 
} 

Gracias por su ayuda.

2

Eso no se puede hacer fácilmente sin cerrar y volver a abrir el cuadro de diálogo. Luego puede llamar a ShowWindow o DoModal según corresponda.

1

Eso no es correcto. Esto se puede hacer, si observas la fuente de MFC, te darás cuenta de que sus diálogos modales no son técnicamente ni siquiera modales. Tendrás que hacer muchos ajustes para que esto funcione correctamente, pero básicamente solo tienes que deshabilitar el elemento principal de la ventana 'modal' y volver a habilitarlo cuando se cierre la ventana 'modal'.

He hecho esto personalmente, así que esto puede funcionar para usted, aunque no estoy exactamente seguro de lo que está tratando de hacer.

+0

¿Qué quiere decir con desactivar/habilitar el elemento primario? Ya traté de llamar a GetParent() -> EnableWindow (FALSE)/GetParent() -> EnableWindow (TRUE), pero esto no funcionó porque mi diálogo también se deshabilitó. La ventana principal pasa a ser el cuadro principal. No sé si esto es relevante. BTW: Lo que quiero hacer es abrir un cuadro de diálogo no modal (Crear/Mostrar ventana) cuando el usuario presiona un botón, el diálogo se convierte en modal. Si el usuario presiona nuevamente el botón, el diálogo vuelve a ser no modal. –

Cuestiones relacionadas