Ver Mensaje Individual
  #129 (permalink)  
Antiguo 03/10/2006, 13:15
juanpablomonte
 
Fecha de Ingreso: julio-2005
Ubicación: Córdoba
Mensajes: 254
Antigüedad: 18 años, 9 meses
Puntos: 0
deshabilitar boton cerrar de windows [x] en winforms

Tema: Boton cerrar en ventana de winforms
Pregunta: Como puedo deshabilitar el boton cerrar de las ventanas de windows en los winforms? ( [x] )
Respuesta:

En algunos casos, podemos necesitar que el usuario no cierre nuestro formulario sino es mas que utilizando un boton personalizado. Por ejemplo que nuestro programa ejecute un proceso, que deba ser detenido, antes de que se cierre el formulario, entonces en un boton detendremos nuestro proceso y luego cerraremos el formulario por ejempo con me.close(); pero esto no ocurriría si le dejamos la opcion de que lo cierre con el boton que windows pone en nuestros formularios, el famoso [x], o bien que cuando este minimizado el form, con el boton derecho del mouse y luego la opcion cerrar... o presionando alt+f4 etc por que esta comprobado que los usuarios son propensos a utilizar estos metodos, por estar mas familiarizados con ellos que con presionar nuestro boton. Para estos casos, necesitamos una funcion que deshabilite todas las opciones de cierre del formulario y que nos deje especificar en nuestro propio boton como será el proceso de cierre.

ejemplo


Aqui esta el codigo fuente.

Código PHP:
//en primera instancia, antes de cualquier declaracion, debemos incluir las librerías necesarias.

Imports System
Imports System
.Drawing
Imports System
.Collections
Imports System
.ComponentModel
Imports System
.Windows.Forms
Imports System
.Data
Imports System
.Runtime.InteropServices

// luego  debajo de la declaracion de la clase form vendra el codigo.

Public Class Form1
    Inherits System
.Windows.Forms.Form

 
Private Const MF_BYPOSITION As Integer = &H400
    
Private Const MF_REMOVE As Integer = &H1000
    
Private Const MF_DISABLED As Integer = &H2

    
//Variable para saber si ya está desactivado el botón X
    
Private pulsado As Boolean True

    
//Importación de procedimientos externos almacenados
    //en la librería de Windows USER32.DLL

    //Obtener el menú de sistema
    
Private Declare Function GetSystemMenu Lib "User32" _
            
(ByVal hWnd As Integer_
            ByVal bRevert 
As Boolean) As IntPtr

    
//Obtener el número de elementos del menú de sistema
    
Private Declare Function GetMenuItemCount Lib "User32" _
             
(ByVal hMenu As Integer) As IntPtr

    
//Quitar elementos del menú de sistema
    
Private Declare Function RemoveMenu Lib "User32" _
        
(ByVal hMenu As Integer_
        ByVal nPosition 
As Integer_
        ByVal wFlags 
As Long) As IntPtr

    
//Redibujar la barra de título de la ventana
    
Private Declare Function DrawMenuBar Lib "User32" _
            
(ByVal hWnd As Integer) As IntPtr

    
//Método que desactiva el botón X (cerrar)
    
Private Sub DisableCloseButton(ByVal hWnd As IntPtr)
        Try 
//captura de excepciones

            
Dim menuItemCount As IntPtr
            Dim hMenu 
As IntPtr
            
//Obtener el manejador del menú de sistema del formulario
            
hMenu GetSystemMenu(hWnd.ToInt32(), False)
            
//Obtener la cuenta de los ítems del menú de sistema.
            //Es el menú que aparece al pulsar sobre el icono a la izquierda
            //de la Barra de título de la ventana, consta de los ítems: Restaurar, Mover,
            //Tamaño,Minimizar,  Maximizar, Separador, Cerrar.
            
menuItemCount GetMenuItemCount(hMenu.ToInt32())
            
//Quitar el ítem Close (Cerrar), que es el último de ese menú
            
RemoveMenu(hMenu.ToInt32(), menuItemCount.ToInt32() - 1MF_DISABLED Or MF_BYPOSITION)
            
//Quitar el ítem Separador, el penúltimo de ese menú, entre Maximizar y Cerrar
            
RemoveMenu(hMenu.ToInt32(), menuItemCount.ToInt32() - 2MF_DISABLED Or MF_BYPOSITION)
            
//Redibujar la barra de menú
            
DrawMenuBar(hWnd.ToInt32())

            
//mostrar un mensaje con la excepción producida
        
Catch pollo As Exception
            MessageBox
.Show("Se ha producido la excepción: " vbCrLf pollo.Message_
            
"Error del programa"MessageBoxButtons.OK)
        
End Try
    
End Sub



// Luego en el evento load del formulario deshabilitaremos nuestro boton `[x]
 
Private Sub Form1_Load(ByVal sender As ObjectByVal e As System.EventArgsHandles MyBase.Load
 
DisableCloseButton
(Me.Handle)

End Sub

End 
Class 

Y esto es finalmente todo... espero que le sirva a alguien, y que sea utilizado para el bien y no para crear "esas" aplicaciones que sirven para hacer daños.

Suerteee !!!!!
__________________
Facil ! Lo unico que hay que hacer para no ser animal, es razonar !