2009-11-03 12 views

Respuesta

116

puede anular OnFormClosing para hacer esto. Solo tenga cuidado de no hacer nada demasiado inesperado, ya que hacer clic en la 'X' para cerrar es un comportamiento bien entendido.

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    base.OnFormClosing(e); 

    if (e.CloseReason == CloseReason.WindowsShutDown) return; 

    // Confirm user wants to close 
    switch (MessageBox.Show(this, "Are you sure you want to close?", "Closing", MessageBoxButtons.YesNo)) 
    { 
    case DialogResult.No: 
     e.Cancel = true; 
     break; 
    default: 
     break; 
    }   
} 
+2

Supongo que quiere minimizar a la bandeja, pero obtienes el +1 de mí por decir que ten cuidado. –

+4

@Jon B: debe verificar el motivo cercano.Si Windows se está cerrando, no quiere mostrar cuadros de mensaje. –

+1

Lo hice una declaración de cambio para no tener que desplazarme hacia la derecha para leer el lado derecho del '==' –

1

Esta es una pregunta muy común. Una buena respuesta está aquí:

VB.NET overload default functionality when user clicks the X (Close Program)


Si usted no se siente cómodo poniendo su código en el evento Form_Closing, la única otra opción Soy consciente de que es un "hack" que he usado una o dos veces No debería ser necesario recurrir a este truco, pero aquí está:


No utilice el botón de cierre normal. En cambio, crea tu formulario para que no tenga ControlBox. Puede hacer esto configurando ControlBox = false en el formulario, en cuyo caso, aún tendrá la barra normal en la parte superior del formulario, o puede establecer FormBorderStyle del formulario en "Ninguno. Si realiza esta segunda ruta, allí no habrá ninguna barra en la parte superior ni en ningún otro borde visible, por lo que tendrá que simularlos dibujando en el formulario o mediante el uso artístico de los controles del Panel

Luego puede agregar un botón estándar y hacer que mirada como un botón de cierre, y poner su código de limpieza en ese país. al final del evento de botón, simplemente llame this.Close() (C#) o Me.Close() (VB)

+0

¿Por qué uno no se sentiría cómodo manejando el evento de cierre? En mi humilde opinión, agregar un botón Cerrar personalizado (pero convincente) no es tan trivial (especialmente cuando se toman en cuenta los efectos de transición y el material Aero, que normalmente se obtiene sin ningún problema). – Groo

+0

En la respuesta a la que me he vinculado, la persona que hizo la pregunta no quería utilizar el evento Form_Closing por algún motivo. No estoy seguro de cuál era su razón, pero él no quería usarlo. Las veces que utilicé el truco, solo quería un botón de cerrar con un aspecto diferente. – David

+0

En otras palabras, la otra respuesta estuvo ligada a (lo justo) y copiada, por lo que la mitad de la respuesta es irrelevante y el resto recomienda algo que no tiene ninguna justificación aquí. – jwg

10

De cualquier anulan la OnFormClosing o registrarse para el evento FormClosing.

Este es un ejemplo de anular la función OnFormClosing en forma derivada:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
} 

Este es un ejemplo del controlador del evento de detener la forma de cierre que puede ser en cualquier clase:

private void FormClosing(object sender,FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
} 

Para obtener más información, compruebe la propiedad CloseReason en FormClosingEventArgs para asegurarse de que se realiza la acción adecuada. Es posible que desee realizar solo la acción alternativa si el usuario intenta cerrar el formulario.

3

Una situación en la que es bastante útil poder manejar el evento de clic con el botón x es cuando está utilizando un Formulario que es un contenedor MDI. La razón es que los eventos cerrados y cerrados se plantean primero con los niños y, por último, con los padres. Entonces, en un escenario, un usuario hace clic en el botón x para cerrar la aplicación y el padre MDI solicita una confirmación para continuar. En caso de que decida no cerrar la aplicación, pero continúe con lo que sea que esté haciendo, los niños ya habrán procesado el evento de cierre que posiblemente haya perdido información/trabajo. Una solución consiste en interceptar el mensaje WM_CLOSE del bucle de mensajes de Windows en su formulario de solicitud principal (es decir, que se cerró, termina la aplicación), así:

protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0010) // WM_CLOSE 
     { 
      // If we don't want to close this window 
      if (ShowConfirmation("Are you sure?") != DialogResult.Yes) return; 
     } 

     base.WndProc(ref m); 
    } 
15

Una cosa estas respuestas carecen y que los novatos probablemente están buscando para, es que si bien es bueno tener un evento:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // do something 
} 

no va a hacer nada en absoluto, a menos que se registre el evento. Poner esto en el constructor de la clase:

this.FormClosing += Form1_FormClosing; 
0
protected override bool ProcessCmdKey(ref Message msg, Keys dataKey) 
    { 
     if (dataKey == Keys.Escape) 
     { 
      this.Close(); 
      //this.Visible = false; 
      //Plus clear values from form, if Visible false. 
     } 
     return base.ProcessCmdKey(ref msg, dataKey); 
    } 
7

como dijo Jon B, pero también querrá comprobar la ApplicationExitCall y TaskManagerClosing CloseReason:

protected override void OnFormClosing(FormClosingEventArgs e) 
{ 
    if ( e.CloseReason == CloseReason.WindowsShutDown 
     ||e.CloseReason == CloseReason.ApplicationExitCall 
     ||e.CloseReason == CloseReason.TaskManagerClosing) { 
     return; 
    } 
    e.Cancel = true; 
    //assuming you want the close-button to only hide the form, 
    //and are overriding the form's OnFormClosing method: 
    this.Hide(); 
} 
-4
  1. basta con ir a la "Program.Designer.cs"
  2. Descubre la función denominada protected override void Dispose(bool disposing)
  3. comentario o eliminar la línea de la base.Dispose(disposing);
  4. En lugar de esa línea Escribe el código de la operación de cierre
0

La respuesta aceptada funciona bastante bien. Un método alternativo que he usado es crear un método FormClosing para el Formulario principal. Esto es muy similar a la anulación. Mi ejemplo es para una aplicación que se minimiza en la bandeja del sistema al hacer clic en el botón de cerrar en el formulario.

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.ApplicationExitCall) 
     { 
      return; 
     } 
     else 
     { 
      e.Cancel = true; 
      WindowState = FormWindowState.Minimized; 
     }    
    } 

Esto permitirá ALT + F4 o nada en la aplicación de llamada Application.Exit(); para actuar de manera normal mientras que al hacer clic en (X) se minimizará la Aplicación.

Cuestiones relacionadas