Je me suis inspiré d'un code déposé en CSharp.NET par "bestmomo" (
http://www.csharpfr.com/code.aspx?ID=33792), que j'ai transcrit en VB.NET, un peu amélioré, et surtout dans lequel j'ai corrigé un bug qui m'a fait tourner en bourrique pendant un moment.
Pour ceux qui iront fouiner dans le code
========================================
La version de "bestmomo" est basée sur la mémorisation (dans un tableau unidimensionnel de structures) des tailles, positions et fonts de la liste des controles contenus dans la Form, ainsi que de leurs conteneurs respectifs. Cela se fait par balayage, grâce à une fonction récursive, de l'arborescence des controles.
Ensuite, lorsque le Resize est demandé, l'arborescence de controles est à nouveau balayée, et l'ancienne taille stockée dans le tableau de structures est modifiée (augmentée ou diminuée) suivant la nouvelle taille de la Form.
Or je me suis aperçu, sur un exemple de Form contenant près de 200 controles, que l'arborescence des controles n'est pas forcément balayée dans le même ordre à deux instants très proches l'un de l'autre. D'où un décalage qui fait que les contrôles sont redimensionnés n'importe comment.
D'autre part, il y a un problème si la Form contient un DataGrid, car un Datagrid peut contenir lui-même des contrôles (TextBox, CheckBox, ou autre). Ma classe 'Resize' s'arrête au niveau de la Datagrid elle-même, sans tenir compte des éventuels contrôles qu'elle contiendrait.
La méthode 'DoResize' possède un argument vrai/faux qui permet d'adapter la taille de la police de chaque contrôle (sauf les Datagrids), et un autre argument qui permet d'affecter un coefficient multiplicateur à la police contenue dans les Datagrids, mais cette dernière fonctionnalité n'est pas au point. Mettre ce dernier à 0 pour l'ignorer.
J'ai fait des tests sur une Form contenant environ 200 contrôles (dont une dizaine de Datagrids), des panels, des groupBox, et conteneurs divers, répartis sur 5 onglets, pas de problèmes. Par contre, avec une telle quantité de controles, ca pédale un peu.
Sur un exemple plus simple tel que celui contenu dans le ZIP, ca marche nickel.
Voilà, I hope this will help you !
19 juil. 2012 à 10:58
Intéressant mais je me suis permis juste pour le plaisir de le modifier légèrement
Maintenant juste la création du composant est nécessaire sur la form plus besoin de spécifier d'autres choses
donc dans la form juste :
Private formSizer As ControlsResize = New ControlsResize(True, Me, True, ValueForDatagrid) doit être présent.
Possibilité de passer chaque valeurs, d'activer ou non le resize des composants
2 déc. 2009 à 14:15
Par contre il ne faut absolument pas réduire la fenêtre dans la barre des taches puis la réafficher.
En tout cas très bon code, je vais essayer de voir ou est le problème.
bon alors
j'ai rajouté une propriété à ta classe :
Public lastFormState As Windows.Forms.FormWindowState
et ensuite dans le resize :
If Me.WindowState <> Windows.Forms.FormWindowState.Minimized And Me.Created And Me.IsHandleCreated And formSizer.lastFormState <> FormWindowState.Minimized Then
' mettre False dans DoResize pour que les polices gardent leur taille initiale
formSizer.DoResize(Me, True, facteur_redim_datagrids)
End If
If formSizer.lastFormState = FormWindowState.Minimized Then
formSizer.InitResize(Me)
End If
formSizer.lastFormState = Me.WindowState
et j'ai supprimé le code dans l'évènement size_changed.
Et je n'ai plus ce problème.
Bon coding à tous
28 oct. 2009 à 08:31
26 oct. 2006 à 11:33
25 oct. 2006 à 15:45
en .net, il suffit d'organiser sa form avec des tableaux et la propriété dock des objets en fill, les redimensionnement se font tout seul.
Bonne continuation
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.