IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Redimensionnement d'un controle


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Redimensionnement d'un controle
    Bonjour,

    J'essaye depuis un certain temps de redimensionner un controle, plus exactement a droite et a gauche.
    A droite, je n'ai pas de probleme (le coin TOP-LEFT du controle ne changeant jamais), mais pour le cote gauche, c'est une autre histoire, car la position LEFT change.
    Je voudrais que le cote Droit reste static quand la souris depasse le minimum autorise (c.Width<40) en bougeant le cote gauche, ce qui marche tres bien pour le cote oppose. Peut-etre un probleme de strategie?
    Je ne vois pas trop par quel bout m'y prendre. Toute suggestion est la bienvenue ou une simple direction.
    Merci,

    JLuc01

    Voici, une partie du code que j'utilise (EdgeEnum.Left etant le probleme).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Private Sub mControl_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles mControl.MouseMove
            Dim c As Control = CType(sender, Control)
     
            If mMouseDown And mEdge <> EdgeEnum.None Then
     
                Select Case mEdge
                   Case EdgeEnum.Left
                        If c.Width < 40 Then
                            c.Width = 42
                            'c.Left = ???'
                            c.SetBounds(c.Left, c.Top, c.Width, c.Height)
                        Else
                            c.SetBounds(c.Left + e.X, c.Top, c.Width - e.X, c.Height)
                        End If
                   Case EdgeEnum.Right
                        If c.Width < 40 And e.X < 40 Then
                            c.Width = 38
                            c.SetBounds(c.Left, c.Top, c.Width, c.Height)
                        Else
                            c.SetBounds(c.Left, c.Top, c.Width - (c.Width - e.X), c.Height)
                        End If
                End Select
                      '...'
                      '...'

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    Avez-vous fait des essais en modifiant les propriétés d’ancrage et de dock du control ?

  3. #3
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Merci pour cette idee. Mais, en fait, je redimensionne un Control dans une Form, donc je ne vois pas 'l'interet de la propriete Dock, et meme la propriete Anchor me mettra le Control sur un cote de la Form.

    En fait, j'ai un peu ameliorer le probleme avec le bout de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Case EdgeEnum.Left                   
             If c.Width < 40 Then
                    If c.Width = 38 And e.X < 0 Then
                                c.SetBounds(c.Left + e.X, c.Top, c.Width - e.X, c.Height)
                    Else
                                c.Width = 38
                                c.SetBounds(c.Left, c.Top, c.Width, c.Height)
                    End If
              Else
                    c.SetBounds(c.Left + e.X, c.Top, c.Width - e.X, c.Height)
              End If
    Tout va bien si je bouge la souris de gauche a droite doucement, mais il y a des problemes lorsque je la bouge rapidement.
    Bref, ce n'est pas encore ideal, mais je suis peut-etre pointilleux.

    A+
    JLuc01

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour JLuc01

    Ce vilain rectangle bounds qui est update en catimini

    Quoique le cas d'un control resize à gauche n'est pas prevu dans l'api des controles net (malgre qu'ils sont d''origine anglaise)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    If c.Cursor = Cursors.SizeNS Or _
                c.Cursor = Cursors.SizeWE
    Mais moult de notre cas "EstWest"....
    mais on peut le gerer si on n'oublie pas :
    - deplacement relatif dx pour un mvmt proportionne
    - en coords Client du control Left=0
    - la coord Right du control est mis à jour en interne (via Left + Width)
    - traiter uniqement les coords de mvt dans les 2 limites Horiz. : Left et Right
    - garder une tolerance dans la maj du Width sinon il sera hors de vu...

    bref voici le code avec "feedback user":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    'ajouter 
    ' 3 boutons radio pour les 3 enums
    ' un label et un panel de test
     
     
    Public Class Form2
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
     
     
        End Sub
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            AddHandler Me.Label1.MouseDown, AddressOf Control_MouseDown
            AddHandler Me.Label1.MouseMove, AddressOf Control_MouseMove
            AddHandler Me.Label1.MouseUp, AddressOf Control_MouseUp
            AddHandler Me.Panel1.MouseDown, AddressOf Control_MouseDown
            AddHandler Me.Panel1.MouseMove, AddressOf Control_MouseMove
            AddHandler Me.Panel1.MouseUp, AddressOf Control_MouseUp
     
        End Sub
        Private oldForeColor As Color
        Private selectionForeColor As Color = Color.LightBlue
     
        Private IsDown As Boolean = False
        'deplacement relatif
        Dim ptDown As Point = New Point(-1, -1)
        Private mEdge As EdgeEnum = EdgeEnum.None
        'memorise  Bounds du control
        Private rc As Rectangle = Rectangle.Empty
     
        Private Sub Control_MouseDown(ByVal sender As System.Object, ByVal e As MouseEventArgs)
            Dim c As Control = CType(sender, Control)
     
            If e.Button = MouseButtons.Left Then
                IsDown = True
                ptDown = e.Location
                oldForeColor = c.BackColor
                rc = c.Bounds
                c.BackColor = selectionForeColor
            End If
        End Sub
        Private Sub Control_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
     
     
            Dim c As Control = CType(sender, Control)
            Dim dx As Integer = e.X - ptDown.X
            rc = c.Bounds
            If IsDown And mEdge <> EdgeEnum.None And e.Button = MouseButtons.Left Then
     
                Select Case mEdge
                    Case EdgeEnum.Left
                        If e.X < c.Right Then 'limite droite
                            rc.Offset(dx, 0)
                            rc.Width = Math.Max(rc.Width - dx, 20) ' tolerance sur le width mini
                            c.Bounds = rc
                        End If
     
                    Case EdgeEnum.Right
                        If e.X > 0 Then 'limite gauche(left =0 car e.x est exprime par rapport à lu-meme)
                            rc.Width = Math.Max(e.X, 20)
                            c.Bounds = rc
                        End If
     
                End Select
     
            End If
     
        End Sub
     
     
        Private Sub Control_MouseUp(ByVal sender As System.Object, ByVal e As MouseEventArgs)
            Dim c As Control = CType(sender, Control)
     
            IsDown = False
            c.BackColor = oldForeColor
     
     
     
        End Sub
        Private Sub radioLeft_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles radioLeft.CheckedChanged,
            radioRight.CheckedChanged, radioNone.CheckedChanged
            Dim c As RadioButton = CType(sender, RadioButton)
            Select Case c.Name
                Case "radioLeft"
                    mEdge = EdgeEnum.Left
     
                Case "radioRight"
                    mEdge = EdgeEnum.Right
                Case "radioNone"
                    mEdge = EdgeEnum.None
     
            End Select
     
     
        End Sub
        Public Enum EdgeEnum
            Left
            Right
            None
        End Enum
     
     
    End Class
    bon code.............

  5. #5
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Merci de l'interet porte a cette question, mais le code ne marche pas mieux.

    Si je bouge le Panel direction a gauche (RadioButton "radioRight"), je retrecis le Panel jusqu'a sa limite minimum et le cote Gauche du Panel ne bouge pas: parfait!
    (La coordonnee X (ou LEFT) ne change pas dans ce cas, donc pas de souci)

    Mais, si je bouge le Panel a droite (RadioButton "radioLeft"), je retrecis le Panel jusqu'a sa limite minimum, puis tout se deplace vers la droite et fini par sortir de la Form: ce que je ne veux pas! Je voudrais que le cote Droit reste static lorsque j'atteind la limite minimum.
    (La coordonnee X (ou LEFT) varie lorsqu'on change la propriete Width, donc plus difficile a gerer, et c'est la le probleme!)

    Je vais tout de meme jeter un oeil sur la methode Offset que je ne connaissais pas.

    Merci encore,
    JLuc01

    NB. De plus, je n'ai pas compris l'interet du Label qui peut bouger.

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    rebonjour JLuc01

    boggus ,& amende honorable pour moi..
    Mais pourquoi?
    Comme deja observe (prop Right maj catamini) je suis tombe dans le piege tendu parce que mon code mets à jour Left(via rc.x) et Width et du coup Right,ce qui fait que la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Case EdgeEnum.Left
                        If e.X < c.Right Then ' est toujours satisfaite  
                            rc.Offset(dx, 0)
    est toujours satisfaite et le rectangle rc bounds est deplace de dx horizontalement ...Il y a un autre "boggus" mais j'y viens ...

    Quand nous travaillons sur le deplacement du cote droit WinForm se charge de fixer Left (c.à.d cote gauche) pour nous c.à.d de la mettre en cache et merci à WinForm le fourbe....
    Mais mais...mais observe que quand nous travaillons sur le deplacement du cote gauche personne ne s'avise de fixer Right (c.à.d cote dtoit) pour nous et c'est pour cela que nous devons "cacher cette variable " au depart ....

    De plus le test doit etre reamenage car nous devons tenir compte du fait que a chaque mouvement souris nous modifions 2 choses :
    -l'origine rc.x
    -e.x
    Et c'est la somme de rc.x +e.x qui doit inferieure à l'abcisse cachedRect.Right

    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
     
    'ajouter 
    ' 3 boutons radio pour les 3 enums
    ' un label et un panel de test
     
     
    Public Class Form2
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
     
     
        End Sub
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
     
     
            AddHandler Me.Label1.MouseDown, AddressOf Control_MouseDown
            AddHandler Me.Label1.MouseMove, AddressOf Control_MouseMove
            AddHandler Me.Label1.MouseUp, AddressOf Control_MouseUp
            AddHandler Me.Panel1.MouseDown, AddressOf Control_MouseDown
            AddHandler Me.Panel1.MouseMove, AddressOf Control_MouseMove
            AddHandler Me.Panel1.MouseUp, AddressOf Control_MouseUp
     
        End Sub
        Private oldForeColor As Color
        Private selectionForeColor As Color = Color.LightBlue
     
        Private IsDown As Boolean = False
        'deplacement relatif
        Dim ptDown As Point = New Point(-1, -1)
        Private mEdge As EdgeEnum = EdgeEnum.None
        'memorise  Bounds du control
        Private rc As Rectangle = Rectangle.Empty
     
        'MISE EN CACHE DE CONTROL.BOUNDS  
        Private cachedRect As Rectangle = Rectangle.Empty
        Private Sub Control_MouseDown(ByVal sender As System.Object, ByVal e As MouseEventArgs)
            Dim c As Control = CType(sender, Control)
     
            If e.Button = MouseButtons.Left Then
                IsDown = True
                ptDown = e.Location
                oldForeColor = c.BackColor
                rc = c.Bounds
                c.BackColor = selectionForeColor
     
                'UN NEW EST NECESSAIRE SINON CHAQUE MAJ DE rc
                'AFFECTERAIT   cachedRect
                cachedRect = New Rectangle(rc.Location, New Size(rc.Width, rc.Height))
     
            End If
        End Sub
        Private Sub Control_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
     
     
            Dim c As Control = CType(sender, Control)
            Dim dx As Integer = e.X - ptDown.X
            rc = c.Bounds
     
            If IsDown And mEdge <> EdgeEnum.None And e.Button = MouseButtons.Left Then
     
                Select Case mEdge
                    Case EdgeEnum.Left
     
                        If rc.X + e.X < cachedRect.Right Then 'limite droite
     
                            rc.Offset(dx, 0)
                            rc.Width = Math.Max(rc.Width - dx, 20) ' tolerance sur le width mini
                            c.Bounds = rc
     
                        End If
     
                    Case EdgeEnum.Right
                        If rc.X + e.X > 0 Then 'limite gauche(left =0 car e.x est exprime par rapport à lu-meme)
                            rc.Width = Math.Max(e.X, 20)
                            c.Bounds = rc
     
                        End If
     
                End Select
     
            End If
     
     
        End Sub
     
     
        Private Sub Control_MouseUp(ByVal sender As System.Object, ByVal e As MouseEventArgs)
            Dim c As Control = CType(sender, Control)
     
            IsDown = False
            c.BackColor = oldForeColor
            'RESET cachedRect
            cachedRect = Rectangle.Empty
        End Sub
        Private Sub radioLeft_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles radioLeft.CheckedChanged,
            radioRight.CheckedChanged, radioNone.CheckedChanged
            Dim c As RadioButton = CType(sender, RadioButton)
            Select Case c.Name
                Case "radioLeft"
                    mEdge = EdgeEnum.Left
     
                Case "radioRight"
                    mEdge = EdgeEnum.Right
                Case "radioNone"
                    mEdge = EdgeEnum.None
     
            End Select
     
     
        End Sub
     
        Public Enum EdgeEnum
            Left
            Right
            None
        End Enum
     
       End Class
    bon code et filons à l'anglaise(= en catimini)....

  7. #7
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonsoir,

    Et merci bien, c'est nettement mieux. Le bord droit se deplace encore un peu dans certain cas, mais c'est relativement stable dans son ensemble.

    Je vais regarder mainternant le code plus attentivement pour voir si je peux regler ce petit probleme (toutefois negligeable), mais au moins je connais la voie a suivre.

    Probleme resolu pour moi.
    A+,

    JLuc01

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Redimensionnement automatique des controls dans un userform
    Par patricktoulon dans le forum Général VBA
    Réponses: 81
    Dernier message: 08/10/2019, 16h48
  2. Réponses: 2
    Dernier message: 29/03/2014, 19h21
  3. comment redimensionner automatiquement mes controles
    Par pierrot67 dans le forum Delphi
    Réponses: 3
    Dernier message: 01/11/2006, 14h59
  4. (MFC) Redimensionner une List Control auto / Boite Dlg
    Par Guybrush113 dans le forum MFC
    Réponses: 7
    Dernier message: 23/04/2004, 09h24
  5. redimensionnement d'une fiche et de ses controles
    Par spoony dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/04/2004, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo