domingo, 8 de abril de 2012

Truco para UserForm

Excel no ofrece de ninguna manera mostrar directamente un formulario sin su barra de titulo, pero esto lo podemos hacer realidad gracias a la utilización de funciones API.

Que es API??

API es un acrónimo de Interfaz de programación de aplicaciones, el conjunto de comandos que utiliza una aplicación para solicitar y realizar servicios de nivel inferior del sistema operativo del PC.

Cuando necesites capacidades que vayan más allá del lenguaje y los controles comunes proporcionados por Microsoft Visual Basic, puedes llamar directamente a los procedimientos incluidos en las bibliotecas de vínculos dinámicos (DLL, Dinamyc Link Libraries). Al llamar a estos procedimientos, podrás tener acceso a los miles de procedimientos que constituyen la espina dorsal del sistema operativo Microsoft Windows, así como a rutinas creadas en otros lenguajes.

Para mostrar un UserForm sin barra de titulo necesitamos cuatro funciones API:
  • Function GetWindowLong
  • Function SetWindowLong
  • Function DrawMenuBar
  • Function FindWindowA 
Que declararemos de forma Privada dentro de nuestro formulario, luego las haremos llamar desde el procedimiento de iniciación del formulario (UserForm_Initialize).

El código quedaría más o menos de la siguiente forma,

Option Explicit
Const GWL_STYLE = -16
Const WS_CAPTION = &HC00000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex 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 DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub UserForm_Initialize()
    Dim lngWindow As Long, lFrmHdl As Long
    lFrmHdl = FindWindowA(vbNullString, Me.Caption)
    lngWindow = GetWindowLong(lFrmHdl, GWL_STYLE)
    lngWindow = lngWindow And (Not WS_CAPTION)
    Call SetWindowLong(lFrmHdl, GWL_STYLE, lngWindow)
    Call DrawMenuBar(lFrmHdl)
End Sub

Un problema que se nos puede presentar al utilizar un formulario sin barra de titulo es que no tenemos manera de cerrarlo si no creamos un botón de cerrar o cambiar su tamaño.



Si quieres aprender mas sobre API pincha aquí.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.