none
2 Question RRS feed

  • Question

  • Bonjour

    Voila je voulais savoir si c'est possible de faire ceci :

    1- déplacer un controler par l'utilisateur avec la sourie pour qu'il le place la ou il veut ( par defaut il serat a une position , comme : (0,0) ) et qu'une foie l'aplication fermer les     parametre soit garder.

    2- est ce que c'est possible , dans un Form de fair une Fenetre dans ce meme Form et quelle soit Déplassable .

    Merci pour vos réponses.

    .::ZeroC00L::.
    mardi 28 avril 2009 06:38

Réponses

  • Bonjour,

    Réponse 1
    Pour faire le déplacement d'un contrôle il faut avoir deux événement MouseMouve et MouseDown

        Dim pxy As Point
    
        Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
            If (e.Button = MouseButtons.Left) Then
                pxy = e.Location
            End If
        End Sub

        Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
            If (e.Button = MouseButtons.Left) Then
                CType(sender, Control).Location = New Point(CType(sender, Control).Location.X + (e.X - pxy.X), CType(sender, Control).Location.Y + (e.Y - pxy.Y))
            End If
        End Sub
    Réponse 2
    Oui il faut mettre une propriété de la form IsMdiContainer = True
    vous trouverez toutes les informations sur http://plasserre.developpez.com/v4-4.htm

    Cordialement,
    mardi 28 avril 2009 08:13
    Auteur de réponse
  • Y a pas de quoi :)

    Vu que je savais du temps je me suis amusé a faire la sauvegarde des positionnements de contrôles dans un fichier XML
    vu que c'est une premier pour moi, pas le XML, mais le Linq to XML j'espère que j'ai pas trop d'erreur meme si je pense que le code en lui même demande encore un peux d'optimisation. Voici le code

    Les variables public :

        Public pxy As Point
    Public oLoadXML As String = "Points.xml"
    Public oSaveXML As String = oLoadXML

    Les événements pour tout les contrôles :

    MouseDown :
         Private Sub MoveControl(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = MouseButtons.Left) Then
    pxy = e.Location
    AddHandler CType(sender, Control).MouseMove, AddressOf MoveNewPointContr
    End If
    End Sub
    MouseMove :
          Private Sub MoveNewPointContr(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = MouseButtons.Left) Then
    With CType(sender, Control)
    AddHandler CType(sender, Control).MouseUp, AddressOf MoveBackContrXML
    .Location = New Point(.Location.X + (e.X - pxy.X), .Location.Y + (e.Y - pxy.Y))

    ' Vérication que le controle est toujours visible dans
    ' sans intégralité, sinon le reposionnement ce fait
    If .Location.X < 0 Then
    .Location = New Point(0, .Location.Y + (e.Y - pxy.Y))
    End If
    If .Location.Y < 0 Then
    .Location = New Point(.Location.X + (e.X - pxy.X), 3)
    End If
    End With
    End If

    End Sub

    MouseUp:
          Private Sub MoveBackContrXML(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Dim myXML = XElement.Load(oLoadXML)
    With CType(sender, Control)

    ' Vérification que le controle exite dans le fichier XML
    ' Si je trouve le meme nom de controle alors j'enregistre
    ' les nouvelles informations dans le fichier
    For Each elem As XElement In myXML.Elements
    If elem.Value = .Name Then
    elem.@LocationX = .Location.X
    elem.@LocationY = .Location.Y
    myXML.Save(oSaveXML)
    Exit For
    End If
    Next

    ' Lecture global du fichier XML pour savoir si le controle est
    ' bien(exitant), dans le cas contraire je crée une nouvelle ligne
    If myXML.ToString.IndexOf(.Name) = -1 Then
    myXML.Add(<contr
    LocationX=<%= .Location.X %>
    LocationY=<%= .Location.Y %>
    >
    <%= .Name %></contr>)
    myXML.Save(oSaveXML)
    End If

    End With

    'RemoveHandler qu'on a pas forcement envie de garder
    RemoveHandler CType(sender, Control).MouseUp, AddressOf MoveBackContrXML
    RemoveHandler CType(sender, Control).MouseMove, AddressOf MoveNewPointContr
    End Sub

    Le code qui ce trouve dans le LoadForm

         Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    'Chargement du fichier XML (il doit etre present, sinon il y a une erreur)
    Dim myXML = XElement.Load(oLoadXML)

    ' Parcours tous les controles et les controles enfants
    For Each contr As Control In Controls
    ' Lecture du fichier XML et reposionnement des controle en fonction des données XML
    For Each contrXML As XElement In myXML.Elements
    If contrXML.Value = contr.Name Then
    contr.Location = New Point(CInt(contrXML.@LocationX), CInt(contrXML.@LocationY))
    End If
    Next

    ' Ajoute l'evenement MouseDown a tous les controles
    AddHandler contr.MouseDown, AddressOf MoveControl

    For Each contrChild As Control In contr.Controls
    For Each contrXML As XElement In myXML.Elements
    If contrXML.Value = contr.Name Then
    contrChild.Location = New Point(CInt(contrXML.@LocationX), CInt(contrXML.@LocationY))
    End If
    Next
    ' Ajoute l'evenement enfants MouseDown a tous les controles
    AddHandler contrChild.MouseDown, AddressOf MoveControl
    Next
    Next
    End Sub

    Le fichier XML doit avoir la balise Root (racine) (n'importe quel nom) puis normalement le reste doit ce faire tout seul


     <?xml version="1.0" encoding="utf-8"?>
    <AllControle>
    <contr LocationX="5" LocationY="6">Button2</contr>
    <contr LocationX="5" LocationY="30">Button1</contr>
    <contr LocationX="5" LocationY="56">ComboBox1</contr>
    </AllControle>


    Donc ce code fait bouger tous les contrôles (enfin je crois, je n'ai testé que sur des boutons)


    Cordialement,
    mardi 28 avril 2009 21:40
    Auteur de réponse
  • Bonjour,

    Au lieux de mettre le bouton gauche on peux le changé avec le bouton droite il suffira de changer "MouseButtons.Left" par "MouseButtons.Right"
    Si le bouton droite de la souris pose problème il faudra alors géré le code en disant que si le contrôle est en mouvement alors ne pas executer le code de l'événement click

    Cordialement, Troxsa
    jeudi 30 avril 2009 08:14
    Auteur de réponse

Toutes les réponses

  • Bonjour,

    Réponse 1
    Pour faire le déplacement d'un contrôle il faut avoir deux événement MouseMouve et MouseDown

        Dim pxy As Point
    
        Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
            If (e.Button = MouseButtons.Left) Then
                pxy = e.Location
            End If
        End Sub

        Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
            If (e.Button = MouseButtons.Left) Then
                CType(sender, Control).Location = New Point(CType(sender, Control).Location.X + (e.X - pxy.X), CType(sender, Control).Location.Y + (e.Y - pxy.Y))
            End If
        End Sub
    Réponse 2
    Oui il faut mettre une propriété de la form IsMdiContainer = True
    vous trouverez toutes les informations sur http://plasserre.developpez.com/v4-4.htm

    Cordialement,
    mardi 28 avril 2009 08:13
    Auteur de réponse
  • Merci pour ta réponse

    je vais voir ce que sa donne

    @++
    .::ZeroC00L::.
    mardi 28 avril 2009 08:14
  • Y a pas de quoi :)

    Vu que je savais du temps je me suis amusé a faire la sauvegarde des positionnements de contrôles dans un fichier XML
    vu que c'est une premier pour moi, pas le XML, mais le Linq to XML j'espère que j'ai pas trop d'erreur meme si je pense que le code en lui même demande encore un peux d'optimisation. Voici le code

    Les variables public :

        Public pxy As Point
    Public oLoadXML As String = "Points.xml"
    Public oSaveXML As String = oLoadXML

    Les événements pour tout les contrôles :

    MouseDown :
         Private Sub MoveControl(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = MouseButtons.Left) Then
    pxy = e.Location
    AddHandler CType(sender, Control).MouseMove, AddressOf MoveNewPointContr
    End If
    End Sub
    MouseMove :
          Private Sub MoveNewPointContr(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    If (e.Button = MouseButtons.Left) Then
    With CType(sender, Control)
    AddHandler CType(sender, Control).MouseUp, AddressOf MoveBackContrXML
    .Location = New Point(.Location.X + (e.X - pxy.X), .Location.Y + (e.Y - pxy.Y))

    ' Vérication que le controle est toujours visible dans
    ' sans intégralité, sinon le reposionnement ce fait
    If .Location.X < 0 Then
    .Location = New Point(0, .Location.Y + (e.Y - pxy.Y))
    End If
    If .Location.Y < 0 Then
    .Location = New Point(.Location.X + (e.X - pxy.X), 3)
    End If
    End With
    End If

    End Sub

    MouseUp:
          Private Sub MoveBackContrXML(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Dim myXML = XElement.Load(oLoadXML)
    With CType(sender, Control)

    ' Vérification que le controle exite dans le fichier XML
    ' Si je trouve le meme nom de controle alors j'enregistre
    ' les nouvelles informations dans le fichier
    For Each elem As XElement In myXML.Elements
    If elem.Value = .Name Then
    elem.@LocationX = .Location.X
    elem.@LocationY = .Location.Y
    myXML.Save(oSaveXML)
    Exit For
    End If
    Next

    ' Lecture global du fichier XML pour savoir si le controle est
    ' bien(exitant), dans le cas contraire je crée une nouvelle ligne
    If myXML.ToString.IndexOf(.Name) = -1 Then
    myXML.Add(<contr
    LocationX=<%= .Location.X %>
    LocationY=<%= .Location.Y %>
    >
    <%= .Name %></contr>)
    myXML.Save(oSaveXML)
    End If

    End With

    'RemoveHandler qu'on a pas forcement envie de garder
    RemoveHandler CType(sender, Control).MouseUp, AddressOf MoveBackContrXML
    RemoveHandler CType(sender, Control).MouseMove, AddressOf MoveNewPointContr
    End Sub

    Le code qui ce trouve dans le LoadForm

         Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    'Chargement du fichier XML (il doit etre present, sinon il y a une erreur)
    Dim myXML = XElement.Load(oLoadXML)

    ' Parcours tous les controles et les controles enfants
    For Each contr As Control In Controls
    ' Lecture du fichier XML et reposionnement des controle en fonction des données XML
    For Each contrXML As XElement In myXML.Elements
    If contrXML.Value = contr.Name Then
    contr.Location = New Point(CInt(contrXML.@LocationX), CInt(contrXML.@LocationY))
    End If
    Next

    ' Ajoute l'evenement MouseDown a tous les controles
    AddHandler contr.MouseDown, AddressOf MoveControl

    For Each contrChild As Control In contr.Controls
    For Each contrXML As XElement In myXML.Elements
    If contrXML.Value = contr.Name Then
    contrChild.Location = New Point(CInt(contrXML.@LocationX), CInt(contrXML.@LocationY))
    End If
    Next
    ' Ajoute l'evenement enfants MouseDown a tous les controles
    AddHandler contrChild.MouseDown, AddressOf MoveControl
    Next
    Next
    End Sub

    Le fichier XML doit avoir la balise Root (racine) (n'importe quel nom) puis normalement le reste doit ce faire tout seul


     <?xml version="1.0" encoding="utf-8"?>
    <AllControle>
    <contr LocationX="5" LocationY="6">Button2</contr>
    <contr LocationX="5" LocationY="30">Button1</contr>
    <contr LocationX="5" LocationY="56">ComboBox1</contr>
    </AllControle>


    Donc ce code fait bouger tous les contrôles (enfin je crois, je n'ai testé que sur des boutons)


    Cordialement,
    mardi 28 avril 2009 21:40
    Auteur de réponse
  • Bonjour,

    Réponse 1
    Pour faire le déplacement d'un contrôle il faut avoir deux événement MouseMouve et MouseDown

        Dim pxy As Point

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
    If (e.Button = MouseButtons.Left) Then
    pxy = e.Location
    End If
    End Sub

        Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
    If (e.Button = MouseButtons.Left) Then
    CType(sender, Control).Location = New Point(CType(sender, Control).Location.X + (e.X - pxy.X), CType(sender, Control).Location.Y + (e.Y - pxy.Y))
    End If
    End Sub
    Réponse 2
    Oui il faut mettre une propriété de la form IsMdiContainer = True
    vous trouverez toutes les informations sur http://plasserre.developpez.com/v4-4.htm

    Cordialement,
    Bonjour

    pour ta réponse 1 , sa marche mais j'ai un petit problème :

    j'ai fait le test avec 2 bouton ,. je peut bouger les bouton mais une foie le click gauche de la sourie relâcher sa valide le click donc sa lance le code qui et sur le click de la sourie,
    y'a t'il un moyen de coriger sa ?

    Merci

    .::ZeroC00L::.
    jeudi 30 avril 2009 07:51
  • Bonjour,

    Au lieux de mettre le bouton gauche on peux le changé avec le bouton droite il suffira de changer "MouseButtons.Left" par "MouseButtons.Right"
    Si le bouton droite de la souris pose problème il faudra alors géré le code en disant que si le contrôle est en mouvement alors ne pas executer le code de l'événement click

    Cordialement, Troxsa
    jeudi 30 avril 2009 08:14
    Auteur de réponse