Propiedades de los form en VB

Necesito por favor ayuda para deshabilitar la por de un form para que esta no se pueda cerrar, ¿cómo le hago?.

1 respuesta

Respuesta
1
Si eliminamos opciones del menú de control (-) de un formulario impedimos que esas mismas acciones se puedan realizar de otras formas. Si quitamos la opción Cerrar el botón de cerrar el formulario (x) quedará dehabilitado. Si eliminamos la opción Mover el formulario no se podrá mover arratrándolo por la barra de titulo, etc.
Veamos un ejemplo de cómo impedir el funcionamiento del botón Cerrar de la barra de titulo :
Declaramos en un módulo :
Public Const MF_BYPOSITION = &H400
Public Const MF_REMOVE = &H1000
Public Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32" _
(ByVal hMenu As Long) As Long
Public Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long
Public Declare Function RemoveMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long
Y para deshabilitar el botón Cerrar eliminamos la opción Cerrar del menú :
Dim hMenu As Long
Dim menuItemCount As Long
'Obtenemos un handle al menú de sistema del formulario
hMenu = GetSystemMenu(Me.hwnd, 0)
If hMenu Then
'Obtenemos el número de elementos del menú
menuItemCount = GetMenuItemCount(hMenu)
'Eliminamos el elemento Cerrar, que es el último
'Los elemento empiezan a numerarse en cero por lo que el
'último es menuItemCount - 1
Call RemoveMenu(hMenu, menuItemCount - 1, _
MF_REMOVE Or MF_BYPOSITION)
'Eliminamos la barra de separación que hay justo antes de la opción Cerrar
Call RemoveMenu(hMenu, menuItemCount - 2, _
MF_REMOVE Or MF_BYPOSITION)
'Forzamos el redibujado del menú. Esto refresca la barra de titulo
'y deja la X deshabilitada
Call DrawMenuBar(Me.hwnd)
End If
Eliminando los botones de maximizar y minimizar siguiendo el método del artículo anterior no quedaban deshabilitados, aunque no funcionaran. Esto se soluciona haciendo esto ANTES de eliminar las opciones del menú (si no las eliminas no quedarán en la barra de titulo pero sí en en el menú de control) :
Dim L As Long
L = GetWindowLong(Me.hwnd, GWL_STYLE)
L = L And Not (WS_MINIMIZEBOX)
L = L And Not (WS_MAXIMIZEBOX)
L = SetWindowLong(Me.hwnd, GWL_STYLE, L)
Las declaraciones son :
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Const WS_MINIMIZEBOX = &H20000
Public Const WS_MAXIMIZEBOX = &H10000
Public Const GWL_STYLE = (-16)
En realidad no es que sea necesario quitar los "botones" antes que las opciones del menú lo que se debe hacer es llamar a "DrawMenuBar" para que el efecto se vea en la pantalla y como ya se hace para quitar las opciones del menú ...
Me parecido excelente la respuesta que me diste era mucho más de lo que esperaba, pues pensaba yo que era una propiedad de simple cambio de valores
Gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas