Interaction sans la souris sur un boutton [VB.net]
Résolu
Utilisateur anonyme
-
cs_Le Pivert Messages postés 8437 Statut Contributeur -
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
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:
- Interaction sans la souris sur un boutton [VB.net]
- Comment activer le pavé tactile sans souris - Guide
- Comment faire apparaître le curseur sans souris - Guide
- Souris ordinateur - Guide
- La flèche de ma souris ne bouge plus ✓ - Forum Bureautique
- Souris hid - Forum souris / Touchpad
11 réponses
Bonjour,
Voir la méthode performclick:
https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.button.performclick?redirectedfrom=MSDN&view=netframework-4.8#code-snippet-2
Voir la méthode performclick:
https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.button.performclick?redirectedfrom=MSDN&view=netframework-4.8#code-snippet-2
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
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
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:
Là tu vois que l’événement Performclick est nécessaire pour activer un button à distance!
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!
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
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
Mais je me trompe surement.
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.
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:
C'est quand même moins précis qu'avec la souris!
@+ Le Pivert
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
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.
Devient :
De même
devient :
Ce sera déjà beaucoup plus précis!
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!
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.
@+
Enfin je pense qu'avec ces conseils, il choisira l'option qui l'arrangera.
@+
Exactement !
Merci, c'est encore mieux maintenant, même si il y a des problems de présisions.
Merci beaucoup
Merci, c'est encore mieux maintenant, même si il y a des problems de présisions.
Merci beaucoup
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 :
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
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
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...
> 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
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:
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!
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!
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
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
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
https://codes-sources.commentcamarche.net/source/101445-le-chat-et-la-souris