Trucos Formularios que no se cierran con el botón (x), no se pueden mover, etc   (2 artículos )

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 título, etc.

Veamos un ejemplo de cómo impedir el funcionamiento del botón Cerrar de la barra de título :

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 título
    '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 título 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ú ...



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com