Quelle douleur que de devoir mettre sur pied la méthode <form>.Resize pour une forme le moindrement complexe.
J'ai mis au point cette approche lorsque j'ai du élaborer le Resize d'une forme contenant des tabs contenant eux-même d'autres controles dont certains étaient redimensionnés et d'autres seulement déplacés tout azimuth. Plus de 400 controles (en comptant les instances de chaque controle des arrays de controles.)
Mettez tout d'abord le ScaleMode de la forme à Pixel: vous aurez ainsi des nombre pas trop gros.
Premiere étape: parcourir la forme au complet et noter les dimensions suivantes de tout les controles dans une table:
<nomParent> Left, Top, Height, Width
<nonControle> Left, Top, Height, Width
Vous vour rendrez la vie facile si vous progressez du Parent au controles contenus et ainsi de suite.
Deuxièmement: griser les cases qui ne changeront pas de dimension en vous referant à vos spécifications pour cette forme.
Pour un controle collé en haut de la forme (ou d'un 'Frame' ou d'un Tab'), Left et Top ne varieront pas.
Pour un controle qui ne sera pas redimensionné, Height et Width Top ne varieront pas.
Evidemment, si toute la ligne d'un controle est grisée, aucune opération n'est nécessaire (Ca ne m'est pas encore arrivé.)
Troisièmement, il faut faire quelques calculs selon la méthode ci-dessous, à mettre dans la même table.
Les commentaires ci-dessous sont traduits de la forme ou j'ai implementé cette méthode et expliquent le détail des calculs.
' Pour les controles redimensionnés -------------------------------------------------
'
' Le 'Rembourage' représente l'espace total libre dans le parent pour un certain controle.
' Ce rembourrage ne varie pas lors des Resize et c'est la clef de l'opération
' Le Parent est l'objet contenant le controle.
'
' 'Rembourage'.Largeur = <Parent>.Width - control.Left - control.Width
' 'Rembourage'.Hauteur = <Parent>.Height- control.Top - control.Height
'
' Pour fixer la Largeur (Width) au 'runtime', on renverse la fonction
' control.Width = Parent.Width - control.Left - 'Rembourage'.Largeur
' De même pour la hauteur.
'
' Le 'Rembourage' est obtenu comme constante pour un controle dans les deux directions, hauteur et largeur, par simple soustraction.
' kW = <Parent>.Width - control.Width
' kH = <Parent>.Height - control.Height
'
' Pour les controles déplacés sans redimensionnement --------------------------------
'
' kMoveW = <Parent>.Width - control.Left 'dimension design time
' kMoveH = <Parent>.Height - control.Top 'dimension design time
'
' -----------------------------------------------------------------------------------
' Pour un controle à la fois déplacé (kMoveW, kMoveH) et redimensionné (kW, kH), le code complet serait:
'
' <ControlName>.Move (<Parent>.Width - kMoveW), (<Parent>.Height - kMoveH),
' (<Parent>.Width - kW),(<Parent>.Height - kH)
' -----------------------------------------------------------------------------------
Comme example, un fragment de code du 'Resize' du Tab 'Main'
Notez que les dimensions du tab on été mises dans des variables (pctTabW = largeur, pctTabH = hauteur)
Les nombres purs sont des dimensions 'design time' du controle qui ne varient pas.
Comme on ne peut laisser des espaces vide and le 'Move', ceux-ci servent a remplir l'appel de fonction.
' -----------------------------------------------------------------------------------
' Main tab
' -----------------------------------------------------------------------------------
' kW = 7925, kH = N/A
<textBox>.Move 5790, 165, lng_pctTabW - 7925, 360
' kMoveW = 2030, kMoveH = N/A
<CheckBox1>(0).Move (lng_pctTabW - 2030)
<CheckBox2)(0).Move (lng_pctTabW - 2030)
<CommandButton>.Move (lng_pctTabW - 2030)
' Ces trois derniers sont seulement déplacés horizontalement d'ou un seul chiffre.
' kW= 5825, kH = 1080
<SSTab1>.Move 5790, 1005, lng_pctTabW - 5825, lng_pctTabH - 1080
' kW= 135 kH = 480
<RichTextBox>.Move 60, 50, (<SSTab1>.Width - 135), (<SSTab1>.Height - 480)
RESULTATS
Une forme contenant presque 255 controles (plus, si on compte les instances des arrays de controls) qui redimensonnent presque sans erreurs au premier essai (temps de debug: 15 minutes).