0

Création de controles dynamiques

51188.cs

Nn 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 le redimensionnement et le déplacement  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 :

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

You must be logged in to post a comment.