IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Location d'un Bouton par rapport a un autre Bouton


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Location d'un Bouton par rapport a un autre Bouton
    Bonjour,

    Voila, j'ajoute dynamiquement des Boutons sur un Panel. On peut bouger ces Boutons avec la souris (Evenements MouseDown, MouseMove et MouseUp).

    Je voudrais savoir comment eviter qu'un Bouton se trouve sur l'autre totalement ou partiellement. Par exemple, je deplace le Bouton A sur le Bouton B, et quand je relache la souris (MouseUp), le Bouton A vient se placer a cote du Bouton B automatiquement.

    Ce que je recherche, c'est la facon de s'y prendre, parce que je suis a cours d'idees.
    Je pensais utiliser les proprieties TOP/LEFT d'un Bouton et le comparer avec la surface de l'autre Bouton, mais cela me parait vraiment complique. Il y a peut-etre plus simple??

    Toutes les idees sont les bienvenues!

    Merci,
    A+
    JLuc01

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Le plus simple c'est de :
    - parcourir dans une boucle tout les contrôles de type "Button" contenus dans ton panel
    - ensuite tu récupères chaque location/dimensions que tu places dans une variable de type rectangle
    - enfin tu compares avec le bouton que tu est en train de déplacer

    A+

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut
    bonjour
    et quand je relache la souris (MouseUp), le Bouton A vient se placer a cote du Bouton B automatiquement.
    Automatiquement à cote?que veux-tu dire? c'est pas clair du tout...
    Il y a 4 positions probables avec alignement de 2 boutons...
    -au dessus, en-dessous ,à gauche aligne,à droite

    Pour les 4 positions sus-cites ,il faut utiliser
    -le rectangle englobant du button selectionne: selbtn.Bounds
    -Api :Rectangle.IntersectWith(btnSel.Bounds,itemButton)
    -memoriser dans un list(of button) tes buttons et iterer par dessus..

    code exemple1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     
    Public Class frmButtons
        Private listeButtons As New List(Of Button)
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
        End Sub
     
        Private Sub frmButtons_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'mets les boutons droppes dans listeButtons
            For Each item As Control In Me.Controls
                If TypeOf (item) Is Button Then
                    listeButtons.Add(item)
                End If
            Next
            'handler des boutons droppes
            For Each item As Button In listeButtons
                AddHandler item.MouseDown, AddressOf Button_MouseDown
                AddHandler item.MouseMove, AddressOf Button_MouseMove
                AddHandler item.MouseUp, AddressOf Button_MouseUp
            Next
        End Sub
        ' button selectionne
        Private selectedButton As Control = Nothing
        'pour dessin
        Private isDragging As Boolean = False
     
        ' Memorise position ou l'user a clicke sur le controle.
        Private clickOffsetX, clickOffsetY As Integer
        Private Sub Button_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            selectedButton = CType(sender, Button)
            If e.Button = MouseButtons.Left Then
     
                clickOffsetX = e.X
                clickOffsetY = e.Y
                'Dragging 
                isDragging = True
            End If
        End Sub
     
        Private Sub Button_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
     
            selectedButton = CType(sender, Button)
            If isDragging Then
                ' deplace button.
                selectedButton.Left = e.X + selectedButton.Left - clickOffsetX
                selectedButton.Top = e.Y + selectedButton.Top - clickOffsetY
                'boucle
                For Each item As Button In listeButtons
                    If item Is selectedButton Then Continue For
                    If Collision(selectedButton, item) Then
                        SetLocation(selectedButton, item)
                    End If
                Next
            End If
        End Sub
     
        Private Sub Button_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            isDragging = False
            selectedButton = Nothing
        End Sub
        Public Function Collision(ByVal selBtn As Button, ByVal itemBtn As Button) As Boolean
            If selBtn.Bounds.IntersectsWith(itemBtn.Bounds) Then
                Return True
            End If
            Return False
        End Function
        Public Sub SetLocation(ByVal selBtn As Button, ByVal itemBtn As Button)
            '  positionnement à gauche
            Dim msg As String = String.Empty
            If selBtn.Bounds.IntersectsWith(itemBtn.Bounds) Then
                selBtn.Left = itemBtn.Left - selBtn.Width
                selBtn.Top = itemBtn.Top
                msg = "gauche"
            End If
     
            ' ou à droite   positionnement droite
            If selBtn.Bounds.IntersectsWith(itemBtn.Bounds) Then
                selBtn.Left = itemBtn.Right
                selBtn.Top = itemBtn.Top
                msg = "droite"
            End If
     
            Me.ToolTip1.SetToolTip(selBtn, msg)
     
        End Sub
    End Class
    Tu peux encore raffiner en divisant le rectangle selBtn.Bounds en ses 4 quadrants et changer le positionnement par exemple :
    - quadrant 1 =>positionnement gauche
    - quaqrant 2=> idem dessus
    - quadrant 3 => idem droite
    - quandrant 4 => idem dessous
    code de division du rectangle selBtn.Bounds et changement des tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
      Public Sub SetLocation(ByVal selBtn As Button, ByVal itemBtn As Button)
            ' 4 quadrants
            Dim quadrant1 As Rectangle = New Rectangle(selBtn.Left + selBtn.Width / 2, selBtn.Top, selBtn.Width / 2, selBtn.Height / 2)
            Dim quadrant2 As Rectangle = New Rectangle(selBtn.Left, selBtn.Top, selBtn.Width / 2, selBtn.Height / 2)
            Dim quadrant3 As Rectangle = New Rectangle(selBtn.Left, selBtn.Top + selBtn.Height / 2, selBtn.Width / 2, selBtn.Height / 2)
            Dim quadrant4 As Rectangle = New Rectangle(selBtn.Left + Width / 2, selBtn.Top + selBtn.Height / 2, selBtn.Width / 2, selBtn.Height / 2)
     
        '------------le test se fait par rapport au 4 rectangles--------------------------
            '------------definisant les 4 quadrants du rectangle englobant de selBtn-----------
     
            '  position gauche
            Dim msg As String = String.Empty
            If quadrant1.IntersectsWith(itemBtn.Bounds) Then
                selBtn.Left = itemBtn.Left - selBtn.Width
                selBtn.Top = itemBtn.Top
                msg = "gauche"
            End If
     
            '  position droite
            If quadrant2.IntersectsWith(itemBtn.Bounds) Then
                selBtn.Left = itemBtn.Right
                selBtn.Top = itemBtn.Top
                msg = "droite"
            End If
     
            Me.ToolTip1.SetToolTip(selBtn, msg)
     
           'suite du code pour les 2 autres quadrants......à faire
     
        End Sub
    bon code..........

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    pas lu les autres réponses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    on mouse up
     
    dim ctrlMemeEndroit = (from c in panel.controls where c.clientrectangle.contains(leCtrlLaché.location).FirstOrDefault
    if ctrlMemeEndroit is nothing then exit sub ' c'est bon
     
    leCtrlLaché.left = ctrlMemeEndroit.left + ctrlMemeEndroit.width +1
    leCtrlLaché.top = ctrlMemeEndroit.top + ctrlMemeEndroit.height +1
    pas testé mais un truc dans le genre je pense

  5. #5
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Tout d'abord merci pour vos reponses, il y a de la matiere a travailler.

    Mabrouki, votre code est fonctionnel et interessant, surtout avec les 4 quadrants. Je ne connaissais pas la methode "IntersectsWith()". Je devrais pouvoir adapter ce code a mon cas.
    (Automatiquement a cote, je voulais dire a sa droite Left+ Width +1)

    Pol63, cette facon de faire me parait encore plus simple, mais j'ai quelques soucis.
    J'ai remplace 'leCtrlLaché' par 'DirectCast(sender, Button)', parce que c'est le controle utilise dans l'evenement MouseUp. Mais, le controle 'ctrlMemeEndroit' me donne une erreur dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DirectCast(sender, Button).Left = ctrlMemeEndroit.left + ctrlMemeEndroit.width + 1
    ' ctrlMemeEndroit.left : left is not a member of System.Collections.Generic.IEnumerable(Of Object)
    De plus, je ne comprends pas l'utilisation de 'FirstOrDefault' dans la premiere ligne, et l'intellisense ne me propose pas cette option (J'utilise le Framework Net 3.5).

    Je vais toutefois essayer d'approfondir les solutions proposes.
    Merci encore.

    A+
    JLuc01

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    au temps pour moi j'ai oublié le select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dim ctrlMemeEndroit = (from c in panel.controls where c.clientrectangle.contains(leCtrlLaché.location) select c).FirstOrDefault
    le from va etre compilé comme un for each

    .First : dès que ca en trouve un ca s'arrête, si ca en trouve aucun je crois que ca plante
    .FirstOrDefault : dès que ca en trouve un ca s'arrête, si ca en trouve aucun ca met Nothing dedans

  7. #7
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Re-bonjour,

    Donc pour l'instant, j'utilise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub aButton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
            Dim aRandomButton As Button = (From c In myPanel.Controls Where c.ClientRectangle.Contains(DirectCast(sender, Button).Location) Select c).FirstOrDefault
            If aRandomButton Is Nothing Then Exit Sub
            DirectCast(sender, Button).Left = aRandomButton.Left + aRandomButton.Width
            DirectCast(sender, Button).Top = aRandomButton.Top
        End Sub
    Meme, s'il y a de l'idee, ce n'est pas tout a fait ca.

    Lorsque j'ajoute un Bouton, il va sur une zone delimitee de mon Panel, exactement en haut a gauche de cette zone.
    Si j'ajoute plusieurs boutons et je les bouge sur ma zone delimitee, l'evenement MouseUp ne deplacera pas automatiquement un bouton se trouvant sur un autre.
    En fait, le 'ClientRectangle' reste en haut a gauche, et si je deplace un Bouton sur cette zone (meme vide, i.d. sans bouton), le Bouton se deplace automatiquement a cote.

    En resume, le deplacement automatique d'un Bouton ne marche que par rapport a l'emplacement (vide ou rempli par le Bouton) du premier Bouton ajoute au Panel.

    Il y a aussi d'autres problemes de positionnement, mais c'est un detail que je devrais pouvoir resoudre plus tard.
    A noter toutefois que cela marche mieux au niveau du positionnement lorsque j'utilise 'LastOrDefault' au lieu de 'FirstOrDefault', avec toujours le probleme du 'ClientRectangle' qui ne suit pas le Bouton. Il reste en haut a gauche. Donc, le Bouton 2 va se placer impecablement a cote du Bouton 1 si je le bouge dans le Rectangle en haut a gauche au lieu de sur le Bouton 1.

    En esperant avoir ete assez clair (malgre mes repetitions),
    Merci,
    A+
    JLuc01

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    ca vient encore de moi
    ClientRectangle retourne un rectangle de 0,0,widht,height
    il faut utiliser bounds qui lui retourne left,top,width,height

    enfin rien ne t'empechait de remarquer ca ... avec un point d'arret le problème saute aux yeux et avec un espion express sur le controle la solution saute aux yeux ...

  9. #9
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    Desole, je suis malheureusement qu'un amateur en VB.net.
    Meme si j'arrive a comprendre la propriete 'Bounds', je pensais que la propriete 'ClientRectangle' etait associe au Bouton, et donc tout a fait appropriee a ce cas. Mais, je dois lire un peu plus les subtilites des proprietes sur MSDN.

    Je verifie ce soir, mais cela devrait etre bon.
    Merci,
    JLuc01

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 173
    Points : 25 113
    Points
    25 113
    Par défaut
    Citation Envoyé par JLuc01 Voir le message
    Desole, je suis malheureusement qu'un amateur en VB.net.
    tu as réussi à modifier le nom des variables suite à un copier coller (et même ne pas faire + .height) tu es au dessus de certains ^^

    enfin je disais ca aussi pour te donner la chose à faire en cas de problème, à savoir un point d'arret, du pas à pas et regarder le contenu des variables
    après on peut voir toutes les propriétés sur le bouton pour trouver celle qui a ce qu'on cherche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Centrer des bouton par rapport a un écran
    Par Didpa dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/04/2010, 15h15
  2. Réponses: 13
    Dernier message: 16/04/2007, 18h25
  3. Réponses: 6
    Dernier message: 10/04/2007, 15h14
  4. [css] Positionnement d'une img par rapport a une autre img
    Par dark_vidor dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 26/02/2006, 00h07
  5. Afficher une fenetre par rapport a une autre
    Par luffy0013 dans le forum MFC
    Réponses: 4
    Dernier message: 14/02/2005, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo