REDIMENSIONNEMENT AUTOMATIQUE DU CONTENU D'UN FORM EN VB.NET

scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 - 20 févr. 2006 à 18:38
cs_claudetom Messages postés 115 Date d'inscription jeudi 11 octobre 2001 Statut Membre Dernière intervention 15 octobre 2012 - 19 juil. 2012 à 10:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36148-redimensionnement-automatique-du-contenu-d-un-form-en-vb-net

cs_claudetom Messages postés 115 Date d'inscription jeudi 11 octobre 2001 Statut Membre Dernière intervention 15 octobre 2012
19 juil. 2012 à 10:58
Bonjour,
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

Imports System.Windows.Forms
Imports System.Collections
Imports System.Drawing

Public Class ControlsResize
    Inherits System.ComponentModel.Component

#Region "Variables locales"
    ' Variable nécessaire au concepteur.
    Private components As System.ComponentModel.Container = Nothing

    Public WithEvents Cont As Control
    Private FormParent As Form
    Public LastFormState As Windows.Forms.FormWindowState
    Public Facteur_redim_datagrids As Integer = 0
    Public AjustementPolice As Boolean
    Public ResizeActived As Boolean = False

    ' Structure pour mémoriser les dimensions
    Private Structure ControlProperties
        Public Top, Left, Height, Width, ContHeight, ContWidth As Integer
        Public FntSize As Single
        Public ctl As control
    End Structure

    ' Variable de mémorisation des dimensions de départ
    Private MemoSize As ArrayList = New ArrayList
#End Region

#Region " Constructeurs "
    Public Sub New(ByVal container As System.ComponentModel.IContainer)
        ' Requis pour la prise en charge du Concepteur de composition de classes Windows.Forms
        container.Add(Me)
        components = New System.ComponentModel.Container
    End Sub

    Public Sub New()
        ' Requis pour la prise en charge du Concepteur de composition de classes Windows.Forms
        components = New System.ComponentModel.Container
    End Sub

    Public Sub New(ByVal ResizeActived As Boolean, ByVal cc As Control, ByVal Ajuste_Polices As Boolean, ByVal facteur_redim_datagrids As Integer)
        MyBase.New()
        InitResize(ResizeActived, cc, Ajuste_Polices, facteur_redim_datagrids)
    End Sub

#End Region

#Region " Initialisation "
    ' paramètre "Ajuste_Polices" : Ajustement optionnel des polices
    ' mettre False pour que les polices gardent leur taille initiale
    Public Sub InitResize(ByVal ResizeActived As Boolean, ByVal cc As Control, ByVal Ajuste_Polices As Boolean, ByVal facteur_redim_datagrids As Integer)
        Me.ResizeActived = ResizeActived
        Me.Cont = cc
        Me.AjustementPolice = Ajuste_Polices
        Me.Facteur_redim_datagrids = facteur_redim_datagrids
        Me.MemoSize.Clear()
        Me.Init(Me.Cont)
    End Sub

    ' Sauvegarde valeurs de départ
    Private Sub Init(ByVal cc As Control)
        Dim ctl As Control
        Dim tCtlProp As ControlProperties = New ControlProperties

        For Each ctl In cc.Controls
            tCtlProp.Height = ctl.Height
            tCtlProp.Width = ctl.Width
            tCtlProp.Top = ctl.Top
            tCtlProp.Left = ctl.Left
            tCtlProp.FntSize = ctl.Font.Size
            tCtlProp.ContHeight = cc.Height
            tCtlProp.ContWidth = cc.Width
            tCtlProp.ctl = ctl
            Me.MemoSize.Add(tCtlProp)
            ' Appel récursif pour les contrôles enfants sauf pour les DataGrids
            If ctl.Controls.Count > 0 AndAlso Not TypeOf ctl Is DataGrid Then
                Me.Init(ctl)
            End If
        Next
    End Sub
#End Region

#Region "Méthodes publiques"

    ' Redimensionnement des contrôles
    Public Sub DoResize()
        If Me.ResizeActived Then Me.Resize()
    End Sub

    Private Sub Resize()
        Dim tCtlProp As ControlProperties
        Dim dProportionateHeight, dProportionateWidth As Single
        Dim i As Integer

        Try
            If Not Me.ResizeActived Then Exit Sub

            ' Redimensionnement des contrôles
            For i = 0 To MemoSize.Count - 1
                ' Récupération des valeurs initiales
                tCtlProp = MemoSize(i)
                ' Calcul des proportions largeur et hauteur
                dProportionateHeight = tCtlProp.ctl.Parent.Height / tCtlProp.ContHeight
                dProportionateWidth = tCtlProp.ctl.Parent.Width / tCtlProp.ContWidth

                ' Calcul des nouvelles dimensions
                tCtlProp.ctl.SetBounds(CType((tCtlProp.Left * dProportionateWidth), Integer), _
                            CType((tCtlProp.Top * dProportionateHeight), Integer), _
                            CType((tCtlProp.Width * dProportionateWidth), Integer), _
                            CType((tCtlProp.Height * dProportionateHeight), Integer))

                If Me.AjustementPolice Then  ' Ajustement des polices optionnelle sauf pour DataGrid
                    If Not TypeOf tCtlProp.ctl Is DataGrid Then
                        tCtlProp.ctl.Font = New Font(tCtlProp.ctl.Font.FontFamily, _
                            tCtlProp.FntSize * dProportionateHeight, _
                            tCtlProp.ctl.Font.Style)
                    End If
                End If
            Next

        Catch ex As Exception
            'on lève l'exception qui vient d'être interceptée
            ' pour la faire remonter au programme appelant
            Throw ex
        End Try
    End Sub

#End Region

    Private Sub Cont_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Cont.HandleCreated
        FormParent = Cont.FindForm 'Récupère la form conteneur
        Me.InitResize(ResizeActived, Cont, AjustementPolice, Facteur_redim_datagrids)
    End Sub

    Private Sub Cont_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Cont.Resize
        If Not FormParent Is Nothing Then
            If FormParent.WindowState <> Windows.Forms.FormWindowState.Minimized And Cont.Created And Cont.IsHandleCreated And LastFormState <> FormWindowState.Minimized Then
                Me.DoResize()
            End If
        End If

        If Me.LastFormState = FormWindowState.Minimized Then
            Me.InitResize(ResizeActived, Cont, AjustementPolice, Facteur_redim_datagrids)
        End If

        If Not FormParent Is Nothing Then LastFormState = FormParent.WindowState
    End Sub
End Class

SgtKabukinan Messages postés 106 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 23 janvier 2010
2 déc. 2009 à 14:15
Si si ça marche très bien après import sous Visual Studio 2008

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
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
28 oct. 2009 à 08:31
Bien dommage que cette source ne fonctionne pas en VB NET 2008. snif
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
26 oct. 2006 à 11:33
Problème: quand je réduis la fenêtre, et que je la rends visible de nouveau. J'ai cette fenêtre mais avec juste le coin haut gauche. On a l'impression d'un zoom sur un carré en haut à gauche de la fentre... Est-ce déjà arrivé à quelqu'un ?
thepoe Messages postés 30 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 1 juin 2011
25 oct. 2006 à 15:45
Salut à tous.

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
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
6 oct. 2006 à 11:38
Bravo et merci de fournir une telle source.

Cependant, une question : Comment faire quand tu créée des contrôles dynamiquement ?

Merci à toi
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
25 sept. 2006 à 16:03
Et ben voila c'est tres bon
2 minutes et j'ai tout compris, ca fonctionne du 1er coup. Magique !!
Merci man, 10/10

@++
LeWolf Messages postés 31 Date d'inscription mardi 14 août 2001 Statut Membre Dernière intervention 29 décembre 2008
10 sept. 2006 à 08:42
Super source,
Mais le resize n'aime pas trop mes listbox.
Après réduction de la feuille et réagrandissement pfuit ....

Sinon super boulot
amsa44 Messages postés 1 Date d'inscription jeudi 9 mars 2006 Statut Membre Dernière intervention 7 avril 2006
7 avril 2006 à 20:59
salam comment va je te remercie et te felicite
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
23 févr. 2006 à 14:08
ah oui, je vois c'est en effet très pénible, mais j'en ai pris mon parti maintenant.
scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 1
22 févr. 2006 à 10:28
Re
Le bug fait que le tabcontrol change l'ordre des tabs aléatoirement. Autant tu vas ouvrir le concepteur 10 fois sans aucun soucis, puis la 11 ieme fois, toutes les tabs vont changer de sens. Ca agace !

Voilou !
Seb.
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
21 févr. 2006 à 22:56
non non, je n'ai pas mal pris ta critique qui n'en est pas vraiment une en plus...
simplement je ne vois pas comment utiliser les Anchor dans mon cas.

Pour ce qui est de la quantité de controles, pour une interface de base de données ou il y a des masques de saisie avec pas mal de champs, les 200 controles sont vite atteints (textBox, Combobox, Labels pour chaque champ)

J'utilise bien les tabControls, mais je n'ai pas constaté de bug particulier. Quel est ce bug exactement ?

Chris
scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 1
21 févr. 2006 à 14:13
Hello,
J'ai l'impression que tu as mal pris ma critique. Je ne voulais pas te vexer, tu as fait du bon boulot !

Perso je n'ai pas de form aussi complexe que la tienne (elle met combien de temps à se charger ? 30 secondes ?!), mais j'utilise les encres sur des forms pas mal complexes tout de meme (comme toi plusieurs onglets, etc, etc). Et entre les panels, les onglets, et tous les conteneurs qui existent je m'en sors bien. Evidement, il faut pour chaque control définir l'encre dans le concepteur, ce qui peut etre galère quand on en a 200 (200?! wahou j'en reviens pas...). Par contre le fait d'ajouter un conteneur, ou meme l'ordre dans lequel tu définis les encres n'influe en rien sur la mise en page.
Par contre je voudrais savoir une chose : pour tes onglets, tu utilises des "tabcontrol" ? Si oui, rencontres-tu le fameux bug de la réorganisation des tabs aléatoirement (bug référencé par microsoft, sans aucun correctif à priori) ? Ou as-tu trouvé une solution ?
Seb.
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
21 févr. 2006 à 11:10
j'aimerais bien que tu me montres un exemple de Form COMPLEXE, c'est à dire avec des onglets, avec des Panels, des GroupBoxes, des DataGrids, etc.... et dont le redimensionnement fonctionne nickel avec les Anchor, ca m'intéresse. Dans mon cas, j'ai 5 onglets, avec au total environ 200 contôles...

J'ai trouvé des exemples sur Internet, mais d'une part, il faut bidouiller avec le Concepteur du projet, ce qui n'est pas génial, l'ORDRE dans lequel on positionne les Anchor sur les objets est apparemment important, et de plus, si tu décides pour une raison X ou Y de rajouter un Conteneur en plein milieu de ta Form, ca chamboule toute l'interaction entre les Anchor. Il faut alors tout reprendre à zéro pour prendre en compte le conteneur ajouté.

qu'en penses-tu ?
scortex84 Messages postés 379 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 20 avril 2011 1
20 févr. 2006 à 18:38
Hello.
C'est pas mal, le ptit plus c'est le redimensionnement des polices (qui marche pas terrible chez moi...).

Je veux pas faire mon rabajoie, mais en utilisant les encres (proprieté anchor des composants), on arrive au meme résultat...

Remarquez moi j'avais codé des lignes et des lignes de codes il y a quelques années tout ça pour découvrir que "instr" faisait la meme chose... ;-) On en apprend tous les jours !

Bonne programmation à toutes (y'en a ?) et à tous !
Seb.
Rejoignez-nous