Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Blog Post

Conocer el estado de la ventana de un formulario

Pregunta

¿Habría alguna manera de saber cuándo se minimiza, maximiza o restaura la ventana de un formulario?

Respuesta

Debes utilizar el evento Resize (al cambiar el tamaño) del formulario y llamar a la función WindowState, que más abajo se expone, pasándole como parámetro la propiedad hWnd del formulario (ésta representa lo que se llama el manipulador o handle – un número que identifica inequívocamente esa ventana en Windows).

La función WindowState devolverá un número identificativo del estado de la ventana. Estos son sus valores y significado:

ValorDescripción
1Ventana restaurada
2Ventana minimizada
3Ventana maximizada
Valores devueltos por WindowState

Ejemplo de uso

(evento Resize de un formulario)

Private Sub Form_Resize()

    ' al cambiar el tamaño de la ventana
    ' llamamos a la función WindowState
    ' pasándole como parámetro la propiedad
    ' hWnd del formulario
    Select Case WindowState(Me.hWnd)
        Case 1 ' normal o restaurada
            MsgBox "ventana restaurada"
        Case 2 ' minimizada
            MsgBox "ventana minimizada"
        Case 3 ' maximizada
            MsgBox "ventana maximizada"
    End Select
    
End Sub

Hay que tener en cuenta en este ejemplo, que por alguna razón de funcionamiento en el redibujado que utiliza Access en los formularios, si el formulario pasa del estado minimizado al estado maximizado, el evento Resize se disparará DOS veces.

… por último, pega el siguiente código en un módulo estandar

Codigo

'---------------------------------------------------------
'
' WindowState
'
' Código escrito originalmente por Juan M Afán de Ribera.
' Estás autorizado a utilizarlo dentro de una aplicación
' siempre que esta nota de autor permanezca inalterada.
' En el caso de querer publicarlo en una página Web,
' por favor, contactar con el autor en
'
'     accessvbafaq@ya.com
'
' Este código se brinda por cortesía de
' Juan M. Afán de Ribera
'
' función que obtiene las coordenadas y estado de una ventana
' y coloca los valores en la estructura WINDOWPLACEMENT
Private Declare Function GetWindowPlacement Lib "user32" _
                (ByVal hWnd As Long, _
                lpwndpl As WINDOWPLACEMENT) As Long
        
' estructura API con coordenadas Left y Top
Private Type POINTAPI
  x As Long
  y As Long
End Type

' estructura API de una forma rectangular
Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

' estuctura con información sobre las coordenadas
' y estado de una ventana
Private Type WINDOWPLACEMENT
  Length As Long
  flags As Long
  showCmd As Long
  ptMinPosition As POINTAPI
  ptMaxPosition As POINTAPI
  rcNormalPosition As RECT
End Type

' función que devuelve el estado de una ventana
Public Function WindowState(hWnd As Long) As Long
Dim ret As Long
Dim WndPl As WINDOWPLACEMENT

    ' asignamos una longitud a la estructura
    ' WINDOWPLACEMENT. Imprescindible!!!
    WndPl.Length = Len(WndPl)
    ' obtenemos la posición de la ventana
    If GetWindowPlacement(hWnd, WndPl) Then
        ' devolvemos el estado actual
        WindowState = WndPl.showCmd
    End If
    
End Function
'---------------------------------------------------------

Créditos

con el fin de dar a conocer el trabajo de uno de los más grandes en el mundo de Access en español, y tras solicitar su permiso, replico este artículo de Juan M Afán de Ribera. Todos los derechos y autoría corresponden a él. Access & VBA FAQ – Conocer el estado de la ventana de un formulario (archive.org)

Taggs:
Related Posts
Opciones de impresión a través de código

Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…

Totales por página

Cómo conseguir en un informe calcular sólo el total para cada página

Write a comment