Meilleur auteur de réponses
2 Question

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::.
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,- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53
-
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
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,- Modifié TroxsaEditor mardi 28 avril 2009 21:49 Re mise en forme (replay)
- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53
-
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- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53
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,- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53
-
-
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
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,- Modifié TroxsaEditor mardi 28 avril 2009 21:49 Re mise en forme (replay)
- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53
-
Bonjour,
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
Réponse 2
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
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,
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::. -
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- Marqué comme réponse Gilles TOURREAUModerator vendredi 8 mai 2009 11:53