Mousemove sur collection? [Résolu]

Signaler
Messages postés
76
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
22 janvier 2009
-
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
-
Bonjour,

je suis actuellement en train d'essayer de faire un systeme permettant à un utilisateur de déplacer des controles à l'aide de la souris.

J'ai trouvé ce tutu : http://www.vbfrance.com/codes/DEPLACER-CONTROLS-FORM-AVEC-SOURIS_38689.aspx . Mais celui-ci ne correspond pas à mes besoins...

En effet, je ne connaos pas le nombre de controles présents, mais ils sont tous rangés dans une collection.

J'aimmerais donc savoir si il serait possible d'appliquer un MouseMove à une collection. Car si je l'utilise sur mon form, la position de la souris n'es pas mis à jour tant que je suis sur un autre objet

Si je ne suis pas assez clair, merci de me le dire

Je vous remercie pour votre aide
Kevin

9 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
32
Oui, c'est ca.
AddHandler permet de lui dire, que dés que l'événement spécifié se produira, il iras dans la sub spécifiée.

__________
  Kenji
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
32
Salut,

La réponse est : AddHandler

__________
  Kenji
Messages postés
76
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
22 janvier 2009

Salut!

tout d'abord merci pour ta reponse

J'ai fait quelques recherches sur internet à propos de AddHandler mais je n'ai rien trouvé de concluant (ou de compréhensible). Pourrais-tu m'expliquer le fonctionnement de AddHandler?

Encore une fois merci

Cordialement
Kevin PERRIAT
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
32
Les pages msdn :
http://msdn2.microsoft.com/en-us/library/7taxzxka(VS.80).aspx
http://msdn2.microsoft.com/en-us/library/6yyk8z93(VS.80).aspx

Pour ton exemple :
' Quelque part à l'initialisation
For Each Ctrl As Control In TaCollectionDeControl
  AddHandler Ctrl.MouseMove, AddressOf Ctrl_MouseMove
Next

Private Sub Ctrl_MouseMove(ByVal Sender As Object, ByVal e As MouseEventArgs)

End Sub, ----
(Coloration syntaxique automatique par Kenji)

__________
  Kenji
Messages postés
76
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
22 janvier 2009

RE salut!

merci pour ton aide, qui fonctionne très bien :

Maintenant j'ai un autre probleme

Tout d'abord voilà mes codes

voilà ma fonction pour ajouter des pictureBox dans mon design:

   Public Function Ajouter(ByVal Couleur As Integer, ByVal Type As Integer)

        Dim PicBrique As New PictureBox

        Me.Controls.Add(PicBrique)

        With PicBrique
         ....
        End With

        Briques.Add(PicBrique)

        'on redirige vers le private sub
        For Each Ctrl As Control In Briques
            AddHandler Ctrl.MouseMove, AddressOf Ctrl_MouseMove
            AddHandler Ctrl.MouseDown, AddressOf Ctrl_MouseDown
            AddHandler Ctrl.MouseUp, AddressOf Ctrl_MouseUp
        Next

    End Function

Puis après pour gérer le déplacement, j'utilise ceci :
;   Private Sub Ctrl_MouseDown(ByVal Sender As Object, ByVal e As _
      MouseEventArgs)
        MouseEnfonce = True
        clickX = e.X
        clickY = e.Y
    End Sub

    Private Sub Ctrl_MouseUp(ByVal Sender As Object, ByVal e As MouseEventArgs)
        MouseEnfonce = False

    End Sub

    Private Sub Ctrl_MouseMove(ByVal Sender As Object, ByVal e As _
      MouseEventArgs)

        PositionX = Sender.Left + e.X
        PositionY = Sender.Top + e.Y

        If MouseEnfonce = True Then
            Sender.Top = PositionY - clickY
            Sender.Left = PositionX - clickX
        End If

    End Sub
Ce code est issu de ce tuto : http://www.vbfrance.com/codes/DEPLACER-CONTROLS-FORM-AVEC-SOURIS_38689.aspx

Lorsque je n'ai qu'une seule brique (picturebox) tout fonctionne très bien. Le probleme, c'est quand j'ai plusieurs briques (picturebox), la dernière insérée se déplace bien mais les précédentes se mettent a "trembler" dans tous les sens

Pourrais-tu m'indiquer dù vient le probleme?

SI vous voulez je peux vous donnez mon fichier pour que ce soit plus clair

Encore merci
Cordialement
Kevin PERRIAT
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
32
Je viens de tester, cela semble fonctionner normalement.
A mon avis, tu te perd dans les coordonnées et tout.
Le plus simple, (une autre méthode) et de faire une classe Brique ou on ajoute directement le code du déplacement.
Ca sera ainsi beaucoup plus propre vu qu'il n'y aura plus la gestion des mouse_move et des des coordonnées.

Public Class Brique
  Inherits System.Windows.Forms.PictureBox

  Private Const WM_NCHITTEST As Integer = &H84
  Private Const HTCLIENT As Integer = &H1
  Private Const HTCAPTION As Integer = &H2

  Protected Overrides Sub WndProc(ByRef m As Message)
    MyBase.WndProc(m)
    If m.Msg = WM_NCHITTEST Then
      If m.Result = CType(HTCLIENT, IntPtr) Then
        m.Result = CType(HTCAPTION, IntPtr)
      End If
    End If
  End Sub
End Class, ----
(Coloration syntaxique automatique par Kenji)

Après compilation, tu n'auras qu'à ajouter les "Brique" sur ta form et le déplacement se fera tout seul.

__________
  Kenji
Messages postés
76
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
22 janvier 2009

tu as testé avec plusieurs briques dans la collection? et ce que le déplacement des anciennes briques qui déconne. la derniere ajoutée se déplace très bien.

Tu pourrais me dire d'où vient le probleme?

Je vais testé ta méthode mais j'aimerais savoir pourquoi cela ne marche pas
Je te remercie pour ta reponse

Cordialement,
Kevin PERRIAT
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
32
Arg, j'avais pas vu ca.
Ok, j'avais pas bien regarder ta fonction ajouter.
Quand tu ajoute les événements, il faut ajouter uniquement ceux de la nouvelle brique. La tu ajoute les événement pour toutes les briques. Donc au final, la pour les premières briques, les événement sont ajouté plusieurs fois.

   Public Function Ajouter(ByVal Couleur As Integer, ByVal Type As Integer)

        Dim PicBrique As New PictureBox

        Me.Controls.Add(PicBrique)

        With PicBrique
         ....
        End With

        Briques.Add(PicBrique)

        'on redirige vers le private sub
        <strike>For Each Ctrl As Control In Briques</strike>
            AddHandler PicBrique.MouseMove, AddressOf Ctrl_MouseMove
            AddHandler PicBrique.MouseDown, AddressOf Ctrl_MouseDown
            AddHandler PicBrique.MouseUp, AddressOf Ctrl_MouseUp
        <strike>Next
</strike>
    End Function

__________
  Kenji
Messages postés
76
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
22 janvier 2009

oui super ça marche !!!!!

donc en fait si je comprend bien AdHandler permet d'ajouter un évenement pour un control particulier c'est bien ça?

je voudrais savoir si ça te generai de parler sur msn afin que tu puisses m'expliquer plus clairement comment tout cela fonctionne exactement? Car je ne veux pas me contenter de faire marcher, mais de comprendre afin de pouvoir réutiliser après

Je te remercie encore pour ton aide (et pour ta patiente)

Encore une fois merci
Cordialement
Kevin PERRIAT