Riesumo questo antico post.
Studiando & studiando, forse alla fine ho trovato una soluzione, valida sia per VB6 che per .Net: posto a beneficio di chi avesse il medesimo problema.
la soluzione che ho trovato (non è nuova, in realtà, bastave cercare bene in rete...) prevede di usare
GetSystemMetrics, un'API di Windows che restituisce i valori, impostati a livello di Sistema, delle dimensioni dei form.
In pratica: in un modulo ho messo questo codice (dichiarazioni + routine MeasureWindowBorder):
- Codice: Seleziona tutto
Public Module SUPPORT_FUNCTIONS
' Costanti da utilizzare, come da http://www.conitec.net/beta/asys_metrics.htm ; valori esplicitati come da header di Visual C++
Const SM_CYCAPTION = 4 'Height of windows caption
Const SM_CXBORDER = 5 'Width of no-sizable borders
Const SM_CYBORDER = 6 'Height of non-sizable borders
Const SM_CXDLGFRAME = 7 'Width of dialog box borders
Const SM_CYDLGFRAME = 8 'Height of dialog box borders
Const SM_CXEDGE = 45 'Width of the edge of a window with 3D-style
Const SM_CYEDGE = 46 'Width of the edge of a window with 3D-style
Public BordW As Long ' Larghezza bordo di una finestra 2D
Public BordH As Long ' Altezza bordo di una finestra 2D (solitamente uguale alla larghezza)
Public EdgeW As Long ' Come BordW, ma per finestra con effetto 3D
Public EdgeH As Long ' Come BordH, ma per finestra con effetto 3D
Public CaptH As Long ' Altezza della "Caption", ovvero della cornice superiore del Form (la striscia che contiene il titolo della finestra)
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Public Sub MeasureWindowBorder()
' reads border width & Height from system settings.
' Values are stored in BordW and BordH global variables.
'BordW = (GetSystemMetrics(SM_CXDLGFRAME) * Screen.TwipsPerPixelX) * 2
'BordH = (GetSystemMetrics(SM_CYDLGFRAME) * Screen.TwipsPerPixelY) * 2
'EdgeW = (GetSystemMetrics(SM_CXEDGE) * Screen.TwipsPerPixelX) * 2
'EdgeH = (GetSystemMetrics(SM_CYEDGE) * Screen.TwipsPerPixelY) * 2
BordW = GetSystemMetrics(SM_CXDLGFRAME)
BordH = GetSystemMetrics(SM_CYDLGFRAME)
EdgeW = GetSystemMetrics(SM_CXEDGE)
EdgeH = GetSystemMetrics(SM_CYEDGE)
CaptH = GetSystemMetrics(SM_CYCAPTION)
End Sub
End Module
All'avvio dell'applicazione, la primissima istruzione che viene eseguita (evento Load del form principale) è:
- Codice: Seleziona tutto
Call MeasureWindowBorder()
A questo punto le variabili Public BordW, CaptH, ecc., contengono lo spazio (in pixel) occupato da ogni elemento della finestra; non rimene che utilizzare le informazioni per ridimensionare correttamente i form, all'interno dei rispettivi eventi Resize
- Codice: Seleziona tutto
Private Sub MyForm_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
' In questo caso, desidero che l'altezza della finestra permetta di visualizzare completamente la Label MyLabel, più un piccolo margine
Dim BottomMargin
BottomMargin = 3
Me.Height = CaptH + Me.MyLabel.Top + MyLabel.Height + BottomMargin + 2 * BordH
End Sub
Spero che questo possa essere utile a qualcuno!
MAx