Creation de controls dynamique + deplacement et redimention pour l'user

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 787 fois - Téléchargée 21 fois

Contenu du snippet

vb 2008 express
un simple exemple permettant de montrer comment créer un contrôle dynamique, lui ajouter des propriétés, évènements puis permettre a l'utilisateur de pouvoir déplacer et redimensionner les contrôles a sa guise sur sa forme

l'exemple à été fait sur des richtextbox
j'ai gérer la redimention et le deplacement sur le bouton gauche de la souris + l'appui sur la touche CTRL ou SHIFT qui me paraissait pratique , de plus sur un RTB le bouton gauche de la souris sert a sélectionner du texte.

pour déplacer :
maintenez la touche CTRL enfoncé et le bouton gauche de la souris pour déplacer le contrôle
pour redimensionner
maintenez la touche SHIFT enfoncé et le bouton gauche de la souris au dessus de contrôle puis redimensionner

créer un projet avec une form et ajouter le code suivant :

Source / Exemple :


Public Class Form1
    Dim ctrlEnCours As RichTextBox 'le control en cours sur lequel on travaille
    Dim poscourante As Point 'la position de la souris sur le control en cours
    Dim deplace As Boolean 'si le controle doit se deplacer
    Dim changetaille As Boolean 'si le controle va changer de taille
    Dim positionClickForm As Point 'position de la souris sur la form
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'CRTL + bouton gauche souris sur un control pour le deplacer
        'SHIFT + bouton gauche souris pour redimentionner

        'creatin de 3 controles pour exemples 
        'leur taille est definie à 70/100, tx et ty 
        'leur position commence au coordonnée 50,50 de la feuille cx et cy

        Dim i, cx, cy, tx, ty As Integer : tx = 70 : ty = 100 : cx = 50 : cy = 50
        For i = 1 To 3
            creer_bouton(i, tx, ty, cx, cy)
            cx = cx + tx + 10 'ecart de 10 entre chaque controle
        Next i
    End Sub

    Private Sub creer_bouton(ByVal numcase As Integer, ByVal taillex As Integer, ByVal tailley As Integer, ByVal xcb As Integer, ByVal ycb As Integer)
        Dim CtrlRtb As New System.Windows.Forms.RichTextBox
        'DEFINITON DES PROPRIETES
        'son nom
        CtrlRtb.Name = "Rtb_" & (numcase + 1)
        'sa taille
        CtrlRtb.Size = New System.Drawing.Size(taillex, tailley)
        'sa position sur la form
        CtrlRtb.Location = New System.Drawing.Point(xcb, ycb)
        'multiligne = oui
        CtrlRtb.Multiline = True
        'visible=oui
        CtrlRtb.Visible = True
        'pas de bordure
        CtrlRtb.BorderStyle = BorderStyle.None
        'ajout du controle à la form
        Me.Controls.Add(CtrlRtb)

        'DEFINITION DES EVENEMENT
        'ajout des evenement utiles au deplacement et redimention
        'des controls précedement crées
        AddHandler CtrlRtb.MouseDown, AddressOf ctrl_MouseDown
        AddHandler CtrlRtb.MouseMove, AddressOf ctrl_MouseMove
        AddHandler CtrlRtb.KeyDown, AddressOf crtl_KeyDown
        AddHandler CtrlRtb.KeyUp, AddressOf crtl_KeyUp
    End Sub

    Private Sub crtl_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        'si on releve ta touche ,
        'on annule le deplacement et le changement de taille
        'pour permettre de travailler sur le texte
        deplace = False
        changetaille = False
    End Sub
    Private Sub crtl_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        ' Vérification si la touche controle est active
        'auquel cas on active le deplacement
        If e.KeyCode = Keys.ControlKey Then
            deplace = True
        End If

        'verification si la touche shif est activé
        'auquel cas on active le changement de taille
        If e.KeyCode = Keys.ShiftKey Then
            changetaille = True
        End If
    End Sub
    Private Sub ctrl_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' si le bouton gauche de la souris est enfoncé
        'on recupere la position 
        If (e.Button = MouseButtons.Left) Then
            poscourante = e.Location
        End If
    End Sub

    Private Sub ctrl_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        'si la souris passe sur le controle ,
        ' il devient le controle courant
        ctrlEnCours = sender
        'on affiche ses bordures (pour mieux travailler
        ctrlEnCours.BorderStyle = BorderStyle.FixedSingle
        ' Vérification si bouton gauche de la souris est bien enfoncé
        If (e.Button = MouseButtons.Left) Then
            'ici on deplace le controle
            If deplace = True Then
                ' Calcul de la nouvelle position du contrôle
                ctrlEnCours.Location = New Point(ctrlEnCours.Location.X + e.X - poscourante.X, ctrlEnCours.Location.Y + e.Y - poscourante.Y)
            End If

            'ici on change la taille du controle
            If changetaille = True Then
                'calcul de la nouvelle taille du controle
                If e.Y > ctrlEnCours.Height Then 'longeur
                    ctrlEnCours.Height = ctrlEnCours.Location.Y + e.Y
                Else
                    ctrlEnCours.Height = e.Y
                End If
                If e.X > ctrlEnCours.Width Then 'largeur
                    ctrlEnCours.Width = ctrlEnCours.Location.X + e.X
                Else
                    ctrlEnCours.Width = e.X
                End If
            End If
        End If
    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        ' si le bouton gauche de la souris est enfoncé
        'on recupere la position 
        If (e.Button = MouseButtons.Left) Then
            positionClickForm = e.Location
        End If
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        'si on se trouve sur la feuille et non au dessus d'un controle richtextbox
        'on enleve les bordure du RTB sur lequel on etait et 
        'on annule le controle en cours
        If Not ctrlEnCours Is Nothing Then
            ctrlEnCours.BorderStyle = BorderStyle.None
            ctrlEnCours = Nothing
        End If
    End Sub
End Class

Conclusion :


code sans pretention , je cherchait juste un moyen de pouvoir redimentionner mes RTB suivants leur contenu et pouvoir les placer ou je voulais sur ma form.

me reste plus qu'a enregistrer ma configuration qui pourra changer ou non suivants mes utilisations.

A voir également

Ajouter un commentaire

Commentaires

elguevel
Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3 -
Salut,

Je n'ai pas encore telechargé ta source, mais juste en voyant le code, quelques remarques :

- Evite dans une classe de declarer tes variables (attributs) avec des "Dim" qui sont reservés aux declarations locales (function/sub/...), utilise plutot Private/Public/Friend/Protected.


- C'est une question de gout mais je n'aime pas trop voir çà :
Dim i, cx, cy, tx, ty As Integer : tx 70 : ty 100 : cx = 50 : cy = 50

J'aurai preferé :

Dim cx As Integer = 50
Dim cy As Integer = 50
Dim tx As Integer = 70
Dim ty As Integer = 100

C'est plus lisible non ?

- Idem pour :

Dim i [...] As Integer
For i = 1 To 3

Tu peux faire :
Dim i As Integer = 1 To 3


Après c'est du pinaillage :
- "cx = cx + tx + 10" --> "cx += tx + 10"
- "If deplace = True Then" --> "If Deplace Then"
etc...

Sinon à part çà c'est simple et commenté, continues comme çà ;-)
Adn56
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1 -
Et le with comme dirais PCPT ^^
With CtrlRtb
25. 'son nom
26. .Name = "Rtb_" & (numcase + 1)
27. 'sa taille
28. .Size = New System.Drawing.Size(taillex, tailley)
29. 'sa position sur la form
30. .Location = New System.Drawing.Point(xcb, ycb)
31. 'multiligne = oui
32. .Multiline = True
33. 'visible=oui
34. .Visible = True
35. 'pas de bordure
36. .BorderStyle = BorderStyle.None
end with
Salut
tresorsdevie
Messages postés
135
Date d'inscription
lundi 17 juin 2002
Statut
Membre
Dernière intervention
20 juillet 2013
-
merci pour ces remarques instructives, j'en prend bonne note!
nicolasq150784
Messages postés
51
Date d'inscription
mercredi 24 juin 2009
Statut
Membre
Dernière intervention
23 avril 2010
-
Salut
merci pour cette source qui est vraiment SUPER
bien expliqué clair en bien quoi....

moi je voudrais savoir si vous pouviez fournir un code qui permet d'enregister les positions

Merci beaucoup d'avance :)
tresorsdevie
Messages postés
135
Date d'inscription
lundi 17 juin 2002
Statut
Membre
Dernière intervention
20 juillet 2013
-
salut , il est tres facile d'enregistrer les positions dans un fichier ini genre

[NOMDUCONTROLE1]
posX=
posY=
TailleX=
TailleY=

[NOMDUCONTROLE2]
posX=
posY=
TailleX=
TailleY=

etc...

tu trouvera sur ce site plusieurs sources pour les fichiers ini
sinon en .net ici : http://tresorsdevie.free.fr/selkis/index.php?option=com_content&view=article&id=111&Itemid=117

a++

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.