c++ - toda - ¿Cuál es la forma correcta de cerrar programáticamente una aplicación MFC?
como cerrar un formulario en c++ (3)
Usando Windows MFC C ++. Tengo una aplicación de terceros que llama a un método definido por el usuario en mi clase derivada de CWinApp. Este método se llama después de InitInstance (). Si hay un error en este método, tal que se lanza una excepción y se atrapa en un bloque try / catch, me gustaría salir de la aplicación desde el bloque catch. ¿Cuál es la manera canónica y correcta de dejar de fumar?
ACTUALIZAR:
Creo que Serge tiene razón en que InitInstance () devolver falso es la forma correcta de salir de la aplicación. Sin embargo, ahora supongamos que deseo salir de un controlador OnInitDialog () de la clase derivada de CDialog, ¿cuál es la forma correcta de hacerlo?
ACTUALIZACIÓN 2
Para mí, encontré que llamar a PostMessage (WM_CLOSE) es la mejor forma de mi clase derivada de CDialog no modal. Todos los otros métodos de dejar de fumar que probé plantearían alguna excepción u otra en algunas circunstancias.
Aquí hay un ejemplo de cómo lo uso:
BOOL SomeDialog::OnInitDialog()
{
CDialog::OnInitDialog();
::OleInitialize(nullptr);
try
{
// ...load settings file here
}
catch(...)
{
PostMessage(WM_CLOSE);
return TRUE;
}
// return TRUE unless you set the focus to a control
return TRUE;
}
Serge: desafortunadamente, tu respuesta no es la mejor manera de hacerlo. PostQuitMessage (0) es el camino a seguir y MFC destruirá las ventanas por usted. Debería evitar llamar directamente a m_pMainWindow-> DestroyWindow ().
Simplemente use:
PostQuitMessage(0);
Tenga en cuenta que su programa no saldrá instantáneamente de esta llamada, la ventana / programa recibirá un mensaje WM_QUIT y luego su programa se cerrará.
En InitInstance ()
Salir de la aplicación mientras todavía estás en InitInstance()
: simplemente devuelve FALSE
desde InitInstance()
.
En el bucle de mensaje principal
Sin embargo, es otra historia si ya estás en el ciclo de mensajes: la forma estándar de cerrar una aplicación es salir del ciclo de mensajes:
PostQuitMessage(0)
, como su nombre lo indica, publica un mensaje WM_QUIT
. El ciclo de mensajes reacciona al salir del ciclo y cerrar el programa.
Pero no debería simplemente hacer eso: debe cerrar las ventanas abiertas en su aplicación. Suponiendo que solo tiene su ventana principal, debe destruirla llamando
m_pMainWindow->DestroyWindow();
MFC reaccionará por PostQuitMessage()
por usted, por lo tanto salga del bucle de mensaje principal y cierre su aplicación.
Mejor aún, debe publicar un WM_CLOSE
para permitir que su ventana principal se cierre correctamente. Por ejemplo, puede decidir guardar el documento actual. Sin embargo, OnClose()
cuidado: el controlador OnClose()
estándar puede solicitarle al usuario que guarde los documentos sucios. El usuario puede incluso cancelar la acción de cierre utilizando este aviso (¿Guardar documento? Sí, No, Cancelar).
La destrucción de la ventana principal publicará un mensaje WM_DESTROY
. MFC reacciona llamando a PostQuitMessage(0)
para salir de la bomba de mensajes. (En realidad, MFC realiza la llamada en OnNcDestroy()
desde WM_NCDESTROY
que es el último mensaje recibido por una ventana)
Aplicación basada en diálogos
Llamar a EndDialog(-1);
// O reemplace -1 por IDCANCEL
, lo que sea
Esta llamada, como probablemente sepa, cerrará el diálogo.
Tenga en cuenta que el diálogo principal de la aplicación basada en cuadros de diálogo se ejecuta en InitInstance (). Cerrar el diálogo simplemente saldrá de InitInstance()
, que siempre devuelve FALSE
en dichos proyectos.