PopAds.net - The Best Popunder Adnetwork

Stili delle Userform

    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.