jueves, 4 de febrero de 2016

Minimizar y maximizar un formulario


Desde hace ya varios años vengo desarrollando herramientas con Visual Basic for Application, pero hasta ahora, no dejo de sorprenderme con todo lo que uno puede aprender diariamente.

A finales del año pasado desarrolle una herramienta, y mi cliente me pidió ciertas actualizaciones, y dentro de ellas es que los formularios puedan minimizarse para que puedan moverse dentro del Excel sin ningún problema, sin necesidad de cerrar el formulario.
Cuando me solicitó este cambio, como siempre respondo: "Claro, no hay ningún problema", pero por dentro no tengo la menor idea de como desarrollarlo.

Sin embargo, gracias a Dios existe Google!!! Alli uno encuentra de todo, cosas buenas y malas, y ya depende de uno que opción escoge.

Pero no nos vayamos por las ramas (como diría el mono); sino que vamos directo al grano (como diría el pollito).

Busque y encontré un código ESPECTACULAR, que me permitió responder a esta necesidad y tener a mi cliente feliz y contento...

El código es el siguiente:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Const WS_MINIMIZEBOX As Long = &H20000
Private Const WS_MAXIMIZEBOX As Long = &H10000
Private Const GWL_STYLE As Long = (-16)


Private Sub UserForm_Initialize()

    Dim lngMyHandle As Long, lngCurrentStyle As Long, lngNewStyle As Long
    If Application.Version < 9 Then
        lngMyHandle = FindWindow("THUNDERXFRAME", Me.Caption)
    Else
        lngMyHandle = FindWindow("THUNDERDFRAME", Me.Caption)
    End If
    lngCurrentStyle = GetWindowLong(lngMyHandle, GWL_STYLE)
    lngNewStyle = lngCurrentStyle Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
    SetWindowLong lngMyHandle, GWL_STYLE, lngNewStyle

End Sub

Es bastante simple de usar. Solamente lo copian y pegan en el UserForm creado y en propiedades se le marca como "False" la que se llama "ShowModal":


Y Listo!!!!

Espero que les sirva: