Stili delle UserForm

Torna a Tutorials

In VBA possiamo definire Userform standard con la barra del titolo che contiene il nome ed il pulsante di chiusura.
Spesso però può capitare, per necessità estetiche o applicative, di dover definire una nuova UserForm senza barra del titolo o senza pulsante di chiusura, oppure finestre ridimensionabili o riducibili a icona.
Mentre in VB professional questo è possibile grazie a BorderStyle, in VBA questa proprietà assume un significato diverso.
In questo caso dovremo definire una nuova classe che conterrà le nuove proprietà, definite grazie alle API di windows.
Vediamo un semplice esempio. Definiamo una Userform di nome "FrmProva" ed inseriamo al suo interno un solo pulsante "CmdEsci" che useremo come pulsante di chiusura nel caso inibissimo il pulsante di chiusura della barra.
Nel codice associato alla UserForm inseriamo:
	Dim FmStile As modStile

	Private Sub UserForm_Initialize()
	    'istanzia un oggetto della classe modNoClose
	    Set FmStile = New modStile
	    'assegna la nostra Userform
	    Set FmStile.Form = Me
	End Sub

	Private Sub CmdEsci_Click()
	   Unload Me
	End Sub
	
Ora creiamo un nuovo modulo di classe e lo chiamiamo "modStile" col seguente codice:
	'Chiamo le API
	Private Declare Function FindWindow Lib "user32" _
	Alias "FindWindowA" _
	(ByVal lpClassName As String, _
	ByVal lpWindowName As String) As Long
	
	'prende lo stile corrente
	Private Declare Function GetWindowLong Lib "user32" _
	Alias "GetWindowLongA" _
	(ByVal hWnd As Long, _
	ByVal nIndex As Long) As Long

	'Imposta il nuovo stile
	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 SetFocus Lib "user32" _
	(ByVal hWnd As Long) As Long
	'stile della finestra
	Private Const GWL_STYLE As Long = (-16)
	'stile della finestra esteso
	Private Const GWL_EXSTYLE As Long = (-20)
	'imposta barra del titolo
	Private Const WS_CAPTION As Long = &HC00000
	'imposta barra di chiusura
	Private Const WS_SYSMENU As Long = &H80000
	'imposta finestra ridimensionabile
	Private Const WS_THICKFRAME As Long = &H40000
	'imposta pulsante riduci
	Private Const WS_MINIMIZEBOX As Long = &H20000
	'imposta pulsante ingrandisci
	Private Const WS_MAXIMIZEBOX As Long = &H10000

	Private mhWndForm As Long

	'Imposto le nuove proprietà
	Public Property Set Form(oForm As Object)

	    'Ottengo le impostazioni di UserForm in base alle versioni
	    If Val(Application.Version) < 9 Then
	        'Excel 97
	        mhWndForm = FindWindow("ThunderXFrame", oForm.Caption)
	    Else
	        'Excel 2000 o superiori
	        mhWndForm = FindWindow("ThunderDFrame", oForm.Caption)
	    End If

	    SetFormStyle

	End Property


	Private Sub SetFormStyle()

	    Dim lStyle As Long

	    lStyle = GetWindowLong(mhWndForm, GWL_STYLE)
	    
	    '(1) Crea una finestra senza barra del titolo
	    'SetWindowLong mhWndForm, GWL_STYLE, lStyle And Not WS_CAPTION
	    '(2) Crea una finestra senza pulsante di chiusura
	    'SetWindowLong mhWndForm, GWL_STYLE, lStyle And Not WS_SYSMENU
	    '(3) Crea una finestra ridimensionabile
	    'SetWindowLong mhWndForm, GWL_STYLE, lStyle Or WS_THICKFRAME
	    '(4) Crea una finestra ridimensionabile e riducibile a icona
	    SetWindowLong mhWndForm, GWL_STYLE, lStyle _
	    Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX

	    'Aggiorno i cambiamenti
	    DrawMenuBar mhWndForm
	    SetFocus mhWndForm
	End Sub
	
In base a quale delle 4 opzioni decommentiamo avremmo i seguenti risultati:
  1. Crea una finestra senza barra del titolo.
  2. Crea una finestra senza pulsante di chiusura.
  3. Crea una finestra ridimensionabile.
  4. Crea una finestra ridimensionabile e riducibile a icona.

Cognolato Studio © 2005