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:
Valor | Descripción |
---|---|
1 | Ventana restaurada |
2 | Ventana minimizada |
3 | Ventana maximizada |
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)
Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…
Cómo conseguir en un informe calcular sólo el total para cada página