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

Résolu/Fermé
Utilisateur anonyme - 30 mars 2016 à 14:10
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 10 avril 2016 à 19:08
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
A voir également:

11 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
30 mars 2016 à 14:52
0
Utilisateur anonyme
30 mars 2016 à 17:43
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
31 mars 2016 à 09:42
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
Utilisateur anonyme
7 avril 2016 à 09:17
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
7 avril 2016 à 10:01
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié par cs_Le Pivert le 7/04/2016 à 14:48
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
7 avril 2016 à 14:57
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
7 avril 2016 à 15:17
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
7 avril 2016 à 15:17
Tout à fait.
A+
0
Utilisateur anonyme
7 avril 2016 à 16:27
Exactement !

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

Merci beaucoup
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 8/04/2016 à 08:30
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
8 avril 2016 à 10:35
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 avril 2016 à 11:44
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
8 avril 2016 à 11:56
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 avril 2016 à 12:14
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
8 avril 2016 à 12:18
Et oui. Tu as trouvé SetBounds
Voilà
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 avril 2016 à 14:51
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
8 avril 2016 à 15:24
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
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
10 avril 2016 à 19:08
Ce post m'a donné l'idée d'un petit programme: Le chat et la souris. C'est tout simple. Merci à toi pijaku pour ton aide.

https://codes-sources.commentcamarche.net/source/101445-le-chat-et-la-souris
0