¿Cómo ocultar solo el botón Cerrar (x)?

151

Tengo un cuadro de diálogo modal y necesito ocultar el botón Cerrar (X), pero no puedo usarlo ControlBox = false, porque necesito mantener los botones Minimizar y Maximizar.

Necesito ocultar solo el botón Cerrar, ¿hay alguna forma de hacerlo?

¡Muchas gracias!

Actualización: tenía permiso para deshabilitarlo, lo cual es más simple :) ¡Gracias a todos!

stefano m
fuente
¿Podría ser esto lo que desea? [Ocultar botón Cerrar [X] de Win Forms en C # .NET] ( sameeramrutia.wordpress.com/2008/09/16/… ) simplemente buscó en Google: ¡ hide close button c#segundo resultado aquí! =)
Miguel Angelo
estás equivocado, no quiero desactivar el botón, pero OCULTARLO ... ¿puedes encontrar una solución?
stefano m
8
Necesidad es una palabra fuerte. ¿De dónde viene este requisito? ¿Cuál es el requisito real: que el usuario no pueda finalizar el programa o que la IU "parezca que no tiene un botón de cierre"? Debido a que hay otras formas de evitar esto, será difícil cerrarlos completamente (por ejemplo, administrador de tareas, tareas, posiblemente alt + f4, etc.). Personalmente, no trabajaría demasiado en esto, porque a menos que esté redefiniendo toda su aplicación de todos modos, será un esfuerzo inútil y romperá las expectativas / continuidad del usuario con otros programas de Windows.
Merlyn Morgan-Graham
44
@ Sayay revela esta página, así que no seas tan crítico.
Brian Graham
1
Rasca el botón de minimizar de tu lista también. Minimizar un cuadro de diálogo modal lo cerrará automáticamente. Necesariamente, es la única ventana que queda que todavía está habilitada. Cuando lo minimiza, no quedaría ninguna ventana que aún pueda obtener el foco para que el usuario no pueda volver a su programa. Ahora estás en "¿esto todavía tiene sentido?" territorio. No lo hace.
Hans Passant

Respuestas:

148

No puede ocultarlo, pero puede deshabilitarlo anulando la propiedad CreateParams del formulario.

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
    get
    {
       CreateParams myCp = base.CreateParams;
       myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
       return myCp;
    }
}

Fuente: http://www.codeproject.com/KB/cs/DisableClose.aspx

Daniel A. White
fuente
gracias, encontré esta solución, pero nos gustaría ocultarla, no solo deshabilitar :( anywat gracias!
stefano m
44
no hay otra forma que no sea diseñar su formulario desde cero.
Daniel A. White
Si. mejor cree su propio formulario con su propia caja de control sin el botón de cerrar y luego oculte la caja de control del formulario principal.
Bahamut
La respuesta de 'Abhishek.Chopra' es simple y efectiva.
Altaf Patel
¿Cómo habilitarlo nuevamente durante el tiempo de ejecución?
Mike de Klerk
158

Podemos ocultar el botón de cierre en el formulario configurando this.ControlBox=false;

Abhishek.Chopra
fuente
29
¿Leíste la pregunta donde especificaba que esa no era una opción?
Servy
28
Hice una búsqueda en Google y este SO QA fue el mejor éxito. Y esta respuesta era lo que estaba buscando. Gracias Abhishek ...
Abel Gaxiola
15
Eso oculta todos esos botones de tamaño. No solo la X.
Rich Shealer
1
Muchas gracias! La manera más fácil.
26

Bueno, puedes ocultarlo eliminando todo el menú del sistema:

private const int WS_SYSMENU = 0x80000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.Style &= ~WS_SYSMENU;
        return cp;
    }
}

Por supuesto, hacerlo elimina los botones de minimizar y maximizar.

Si mantiene el menú del sistema pero elimina el elemento de cierre, el botón de cierre permanece pero está deshabilitado.

La alternativa final es pintar el área no cliente usted mismo. Eso es bastante difícil de acertar.

David Heffernan
fuente
44
Esto también funciona, genial! Pero ControlBox = false es fácil de usar a tu manera.
simmeone
1
Esto es lo mismo que establecer ControlBoxen falso. Además, no cumple el requisito: necesito mantener los botones Minimizar y Maximizar
whiteshooz
23

puedes ocultar el cuadro cerrado usando

this.ControlBox = false;

y no olvides agregar espacios en blanco this.Text = " "para que sea así

ingrese la descripción de la imagen aquí

Ramgy Borja
fuente
2
Esto es lo que necesito. Gracias.
Kosmas
2
Esto no es correcto. Directamente de la pregunta de OP: No puedo usarControlBox = false
Martin
8

Si realmente desea ocultarlo, como en "no visible", entonces probablemente tendrá que crear un formulario sin bordes y dibujar los componentes del subtítulo usted mismo. La biblioteca VisualStyles tiene los Elementos de Windows disponibles. También tendría que agregar nuevamente la funcionalidad de cambiar el tamaño del formulario o mover el formulario agarrando la barra de subtítulos. Sin mencionar el menú del sistema en la esquina.

En la mayoría de los casos, es difícil justificar que el botón "cerrar" no esté disponible, especialmente cuando desea un formulario modal con capacidades minimizadoras. Minimizar una forma modal realmente no tiene sentido.

LarsTech
fuente
2

En las propiedades de su formulario, configure 'Control Box' = False pero también ocultará Minimized y Maximize.

Muhammad Haroon
fuente
1

Bueno, puede ocultar el botón de cierre cambiando el FormBorderStyle de la sección de propiedades o programáticamente en el constructor usando:

public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
}

luego crea un elemento de tira de menú para salir de la aplicación.

salud

Josh John
fuente