Interaction sans la souris sur un boutton [VB.net]

Résolu
Utilisateur anonyme -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
Bonjour,

Introduction

J'ai une écran tactile sur Windows 10, je suis en train de créer un programme relatif à ça, mais j'ai un petit souci.

Principe du programme

Il y à une fenêtre dans lequel se trouve 2 panel,
celui du dessous permet faire bouger une croix noire qui est dans l'autre panel(dessus) grâce à l'écran tactile, (on peut aussi le faire avec la souris mais le but, c'est avec le doigt)
Donc, quand je bouge mon doigt, la croix noire bouge en même temps.

Mon problème

J'aimerais que quand la croix noire survole un bouton qui est dans le panel, le bouton se contourne de bleu, comme avec la souris sur un bouton, et que lorsque je clique avec mon doigt dans le panel du bas, la croix fasses l'action de "cliquer" sur le bouton, et que le bouton fait se qu'il à faire.

en image


_______

En gros

qu'il y ai une action qui se produise par l'intermédiaire d'une croix noir (Picturebox)
sur un bouton.

Voilà merci déjà pour vos raiponces.
Cordialement VANAUR

11 réponses

  1. Utilisateur anonyme
     
    Merci d'avoir répondu si vite, mais se n'est pas sa que je cherche (désoler)

    Effet il faudrait que quand la croix (pictureboxe1) survole n'importe quelle partie du bouton, et que l'on click sur la zone de déplacement tactile
    ici entourée en jaune :
    http://static.commentcamarche.net/www.commentcamarche.net/pictures/yUTSAXi12ZGwXMF3MTKtq2S99z214ixSViCyw6DqkEd9254IQPPVNV3qtIdZJugc-question-image-ccm-1223.png
    le bouton se "sélectionne" comme si on cliquais avec la souris sur un bouton, mais là... sans souris, juste avec la croix

    Merci
    Cordialement VANAUR
    0
  2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Je ne pense pas que cela soit possible avec une PictureBox. Par contre on peut changer le curseur en croix.
    Voici un petit exemple:

    Mettre en haut du Form un panel et un button:
    Panel1 et Button1

    En bas du Form un panel et un button:
    Panel2 et Button2

    Il suffit de survoler le Button1 pour qu'il change de couleur et ensuite de cliquer dans le Panel2 pour avoir le message.

    Voici le code:

    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Button2.PerformClick()
            Button1.FlatStyle = FlatStyle.System
            Button1.FlatAppearance.BorderColor = Color.White
        End Sub
        Private Sub Button1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
            Button1.FlatStyle = FlatStyle.Flat
            Button1.FlatAppearance.BorderColor = Color.Blue
        End Sub
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            MsgBox("Hello")
        End Sub
       Private Sub Panel1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
            Panel1.Cursor = Cursors.Cross
             End Sub
        Private Sub Panel2_Click(sender As Object, e As System.EventArgs) Handles Panel2.Click
            If Button1.FlatAppearance.BorderColor = Color.Blue Then
                Button1.PerformClick()
            End If
        End Sub
    End Class
    


    Là tu vois que l’événement Performclick est nécessaire pour activer un button à distance!
    0
  3. Utilisateur anonyme
     
    Merci beaucoup, sa se rapproche de la raiponce que j'attendais, je pense que sa fonctionne ! Merci, je vais faire avec et modifier un peu le code pour qu'il convienne mieux.

    Merci
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Je pense que c'est faisable.
    C'est juste un peu d'arithmétique au final non?

    Au départ, tu disposes de :
    1- la position (Left et Top) du bouton dans le panel1
    2- la taille (Width et Height) du bouton
    3- la position (Left et Top) de la picturebox dans le panel1
    4- la taille (Width et Height) de la picturebox

    Il "suffit" donc de "surveiller" le "déplacement" de la picturebox, et si elle survole le bouton, changer l'apparence de celui-ci.
    Private Sub Panel1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseMove
    If PictureBox.Left > Bouton.Left And PictureBox.Left < Bouton.Left + Bouton.Width Then
        If PictureBox.Top > Bouton.Top And PictureBox.Top < Bouton.Top + Bouton.Eight Then
    'etc... Il faut prendre en compte aussi la hauteur et la largeur de la picturebox
    '... Then
    Button1.FlatAppearance.BorderColor = Color.Blue
    Else
    Button1.FlatAppearance.BorderColor = Color.White


    Mais je me trompe surement.
    0
  6. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour pijaku,

    Tu as eu la bonne approche, la seule rectification, il faut mettre ton code dans l'evenement MouseMove de la Picturebox comme ceci:

    Public Class Form1
        Dim x, y As Integer
        Private Sub PictureBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            If e.Button = Windows.Forms.MouseButtons.Left Then
                x = e.X
                y = e.Y
            End If
        End Sub
        Private Sub PictureBox1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
            If e.Button = Windows.Forms.MouseButtons.Left Then
                PictureBox1.Left += (e.X - x)
                PictureBox1.Top += (e.Y - y)
                PictureBox1.Cursor = Cursors.Hand 'curseur main
                If PictureBox1.Left >= Button1.Left And PictureBox1.Left <= Button1.Left + Button1.Width Then
                    Button1.FlatStyle = FlatStyle.Flat
                    Button1.FlatAppearance.BorderColor = Color.Blue
                End If
                If PictureBox1.Top >= Button1.Top And PictureBox1.Top <= Button1.Top + Button1.Height Then
                    Button1.FlatStyle = FlatStyle.Flat
                    Button1.FlatAppearance.BorderColor = Color.Blue
                End If
            End If
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Button2.PerformClick()
            Button1.FlatStyle = FlatStyle.System
            Button1.FlatAppearance.BorderColor = Color.White
        End Sub
        Private Sub Panel2_Click(sender As Object, e As System.EventArgs) Handles Panel2.Click
            If Button1.FlatAppearance.BorderColor = Color.Blue Then
                Button1.PerformClick()
            End If
        End Sub
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            MsgBox("Hello")
        End Sub
    End Class


    C'est quand même moins précis qu'avec la souris!

    @+ Le Pivert
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Oui, mais...
      Attention, tu ne tiens pas compte de la hauteur ni de la largeur du picturebox.
      C'est ce que j'indiquais plus haut.

      If PictureBox1.Left >= Button1.Left

      Devient :
      If PictureBox1.Left + PictureBox1.Width >= Button1.Left


      De même
      If PictureBox1.Top >= Button1.Top

      devient :
      If PictureBox1.Top + PictureBox1.Height >= Button1.Top


      Ce sera déjà beaucoup plus précis!
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Je suis d'accord avec toi, mais j'ai fait mes essais en partant du point inférieur droit avec ma Picturebox. Donc les dimensions de la Picturebox n'entrent pas en ligne de compte, mon bouton étant en haut à gauche. Le changement s'effectue bien avant le survol du bouton.
      Enfin je pense qu'avec ces conseils, il choisira l'option qui l'arrangera.

      @+
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        Tout à fait.
        A+
        0
  7. Utilisateur anonyme
     
    Exactement !

    Merci, c'est encore mieux maintenant, même si il y a des problems de présisions.

    Merci beaucoup
    0
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pourquoi utiliser le PictureBox.MouseMove???
    La souris (le doigt) ne sort jamais du panel2 (à ce propos, dans mon essai de code plus haut, me suis gourré, c'est Panel2.MouseMove).
    C'est peut-être pour ça que vous perdez en précision.

    Je vous ai fait un exemple vite fait en VBA, n'étant pas vbnettiste.

    Sur un UserForm :
    - 1 Frame nommé Frame1 (en haut de l'USF) contenant :
    ===> 1 commandbutton CommandButton1 = gris
    ===> 1 label Label1 = rouge
    - 1 Frame nommé Frame2 (en bas de l'USF)

    Tout se commande depuis le Frame2. Il faut cliquer gauche, maintenir le bouton enfoncé et bouger la souris (et oui, rien de tactile chez moi...)
    Le bouton passe au vert au survol.
    Un doubleclic dans le Frame2 envoie la procédure CommandButton_Click si le label est situé sur le bouton...
    Aucun problème de précision!
    Ce code :

    Option Explicit
    
        Private Start As Boolean
        Private SourisX As Double
        Private SourisY As Double
        Private Clic_Possible As Boolean
        
        Private Sub UserForm_Initialize()
            Label1.ZOrder
        End Sub
        
        Private Sub Frame2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            If Button = 1 Then Start = True
            SourisX = X
            SourisY = Y
        End Sub
        
        Private Sub Frame2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            If Not Start Then Exit Sub
            With Me.Label1
                .Move .Left + X - SourisX, .Top + Y - SourisY
                If Intersection(Label1, CommandButton1) = True Then
                    CommandButton1.BackColor = &HC000&
                    Clic_Possible = True
                Else
                    CommandButton1.BackColor = &H8000000F
                    Clic_Possible = False
                End If
                DoEvents
                SourisX = X
                SourisY = Y
            End With
        End Sub
        
        Private Sub Frame2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
            If Clic_Possible Then CallByName UserForm1, "CommandButton1_Click", VbMethod
        End Sub
        
        Private Sub Frame2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            If Button = 1 Then Start = False
        End Sub
    
        '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        'Cette Sub doit être public pour être appelée par la fonction CallByName
        Public Sub CommandButton1_Click()
            MsgBox "Gagné!"
        End Sub
    
        Private Function Intersection(Lab As Control, Butt As Control) As Boolean
        Dim LL As Double, LT As Double, LW As Double, LH As Double
        Dim BL As Double, BT As Double, BW As Double, BH As Double
        
            Intersection = False
            LL = Lab.Left: LT = Lab.Top: LW = Lab.Width: LH = Lab.Height
            BL = Butt.Left: BT = Butt.Top: BW = Butt.Width: BH = Butt.Height
            If LL + LW > BL And LL < BL + BW And LT + LH > BT And LT < BT + BH Then
                Intersection = True
            ElseIf LT + LH > BT And LT < BT + BH And LL < BL + BW And LL + LW > BL Then
                Intersection = True
            ElseIf LT < BT + BH And LT + LH > BT And LL + LW > BL And LL < BL + BW Then
                Intersection = True
            ElseIf LT < BT + BH And LT + LH > BT And LL < BL + BW And LL + LW > BL Then
                Intersection = True
            Else
                Intersection = False
            End If
        End Function


    Le fichier exemple

    N'a pas été traité dans ce fichier la sortie du frame2 en maintenant le clic...
    Par contre, la fonction Intersection peut vous être utile...

    Avant, j'arrivais jamais à finir mes phrases... mais maintenant je
    0
  9. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Et voici le code VBA (désolé hein ;-) pas VB.Net) avec empêchement de sortir :
    > la souris du frame2
    > le label du frame1

    Je ne note aucune imprécision. Pourtant VBA doit être moins "puissant" que VB.Net...

    Option Explicit
    
        Private Start As Boolean
        Private SourisX As Double
        Private SourisY As Double
        Private Clic_Possible As Boolean
        
        Private Const MARGE_FRM_GAUCHE As Byte = 5
        Private Const MARGE_FRM_HAUT As Byte = 10
        
        Private Sub UserForm_Initialize()
            Label1.ZOrder
        End Sub
        
        Private Sub Frame2_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            If Button = 1 Then Start = True
            SourisX = X: SourisY = Y
        End Sub
        
        Private Sub Frame2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            'empêche le déplacement au survol de la souris (sans clic gauche enfoncé)
            If Not Start Then Exit Sub
            'empêche la sortie de la souris du Frame2
            If X < 0 Or Y < 0 Then Start = False
            With Me.Label1
                'empêche la sortie du label du Frame1
                Select Case Tente_De_Sortir(Frame1, Label1)
                    Case 0: .Move .Left + X - SourisX, .Top + Y - SourisY
                    Case 1: .Move 2, .Top
                    Case 2: .Move .Left, 2
                    Case -1: .Move .Left - 2, .Top
                    Case -2: .Move .Left, .Top - 2
                End Select
                DoEvents
                SourisX = X: SourisY = Y
            End With
            If Intersection(Label1, CommandButton1) = True Then
                CommandButton1.BackColor = &HC000&: Clic_Possible = True
            Else
                CommandButton1.BackColor = &H8000000F: Clic_Possible = False
            End If
        End Sub
        
        Private Sub Frame2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
            If Clic_Possible Then CallByName UserForm1, "CommandButton1_Click", VbMethod
        End Sub
        
        Private Sub Frame2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
            If Button = 1 Then Start = False
        End Sub
    
        '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        'Cette Sub doit être public pour être appelée par la fonction CallByName
        Public Sub CommandButton1_Click()
            MsgBox "Gagné!"
        End Sub
    
        Private Function Intersection(Ctrl_1 As Control, Ctrl_2 As Control) As Boolean
            Intersection = False
            If Ctrl_1.Left + Ctrl_1.Width > Ctrl_2.Left And Ctrl_1.Left < Ctrl_2.Left + Ctrl_2.Width And Ctrl_1.Top + Ctrl_1.Height > Ctrl_2.Top And Ctrl_1.Top < Ctrl_2.Top + Ctrl_2.Height Then
                Intersection = True
            ElseIf Ctrl_1.Top + Ctrl_1.Height > Ctrl_2.Top And Ctrl_1.Top < Ctrl_2.Top + Ctrl_2.Height And Ctrl_1.Left < Ctrl_2.Left + Ctrl_2.Width And Ctrl_1.Left + Ctrl_1.Width > Ctrl_2.Left Then
                Intersection = True
            ElseIf Ctrl_1.Top < Ctrl_2.Top + Ctrl_2.Height And Ctrl_1.Top + Ctrl_1.Height > Ctrl_2.Top And Ctrl_1.Left + Ctrl_1.Width > Ctrl_2.Left And Ctrl_1.Left < Ctrl_2.Left + Ctrl_2.Width Then
                Intersection = True
            ElseIf Ctrl_1.Top < Ctrl_2.Top + Ctrl_2.Height And Ctrl_1.Top + Ctrl_1.Height > Ctrl_2.Top And Ctrl_1.Left < Ctrl_2.Left + Ctrl_2.Width And Ctrl_1.Left + Ctrl_1.Width > Ctrl_2.Left Then
                Intersection = True
            Else
                Intersection = False
            End If
        End Function
        
        Private Function Tente_De_Sortir(Frm As Control, Lbl As Control) As Integer
            Tente_De_Sortir = 0
            Select Case True
                Case Lbl.Left < 1: Tente_De_Sortir = 1
                Case Lbl.Left + Lbl.Width > Frm.Width - MARGE_FRM_GAUCHE: Tente_De_Sortir = -1
                Case Lbl.Top < 1: Tente_De_Sortir = 2
                Case Lbl.Top + Lbl.Height > Frm.Height - MARGE_FRM_HAUT: Tente_De_Sortir = -2
            End Select
        End Function

    0
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      Cela fonctionne très bien en vba. Pour remplacer Label1.Move en VB.Net PictureBox1.Move n'existe pas. J'ai cherché déplacer une PictureBox à partir d'un autre controle, je n'ai rien trouvé!
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        Si VB.Net ne dispose pas de la méthode Move pour ces contrôles, mais ou va t'on?

        Bah, faut utiliser ses coordonnées... .Left et .Top.
        En Fait,
        Ctrl.Move Left, Top, Width, Height
        n'est qu'une façon plus simple d'écrire :
        With Ctrl
            .Left = 321
            .Top = 125
            .Width = 30
            .Height = 20
        End With
        0
  10. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bon avec un peu de persévérance, j'ai trouvé en prenant ton code de départ encore plus simple. Tout se fait a partir du panel2, il faut vraiment être au dessus du bouton pour l'activer:

    Public Class Form1
        Dim x, y As Integer
        Private Sub Panel2_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Panel2.MouseMove
            If e.Button = Windows.Forms.MouseButtons.Left Then
                PictureBox1.SetBounds(e.X, e.Y, 50, 50)
                If PictureBox1.Left >= Button1.Left And PictureBox1.Left <= Button1.Left + Button1.Width And PictureBox1.Top >= Button1.Top And PictureBox1.Top <= Button1.Top + Button1.Height Then
                    Button1.FlatStyle = FlatStyle.Flat
                    Button1.FlatAppearance.BorderColor = Color.Blue
                End If
            End If
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Button2.PerformClick()
            Button1.FlatStyle = FlatStyle.System
            Button1.FlatAppearance.BorderColor = Color.White
        End Sub
        Private Sub Panel2_DoubleClick(sender As Object, e As System.EventArgs) Handles Panel2.DoubleClick
            If Button1.FlatAppearance.BorderColor = Color.Blue Then
                Button1.PerformClick()
            End If
        End Sub
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            MsgBox("Hello")
        End Sub
    End Class


    Voilà, je laisse le soin à minotaugames de trouver le code pour empêcher la PictureBox de sortir du panel en faisant référence a ton code.
    Si il le désire!
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bon avec un peu de persévérance, j'ai trouvé en prenant ton code de départ encore plus simple. Tout se fait a partir du panel2, il faut vraiment être au dessus du bouton pour l'activer:
      En effet. Encore faut-il, avec cet exemple, que la pictureBox soit plus petite que le bouton.
      Mais là minotaugames a, de toutes façons, tout ce qu'il lui faut pour avancer.
      Merci de cet échange très constructif.
      A bientôt.
      Franck
      0