Arnal88
Messages postés96Date d'inscriptionsamedi 21 octobre 2006StatutMembreDernière intervention25 avril 2009
-
29 sept. 2007 à 18:34
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 2014
-
29 sept. 2007 à 22:33
Bonjour,
Je suis en train de développer un petit jeu sous VB 2005, où je dois contrôler les déplacements du joueur à l'aide du clavier.
Le problème est le suivant : ma Form contient également plusieurs boutons, et c'est eux qui prennent le focus. Donc lorsque j'appuye sur gauche ou droite, cela déplace le focus d'un bouton à l'autre, mais ne déclenche pas l'événement KeyDown de ma Form...
Je tiens à préciser que j'ai bien mis Form.KeyPreview = True, et la Form intercepte les événements de tous les contrôles, mais cela ne marche pas pour les touches de direction !
Avez-vous une solution ?? Cela fait un moment que je bloque sur ce problème..
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 29 sept. 2007 à 20:56
Tiens (même pas besoin d'un booléenne) :
Essaye :
Une Form (avec Keypreview = True) , 2 boutons de commandes command1 et Command2 et une shape Shape1
et ce code :
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 112 Then
ouinon = Not ouinon
Command1.Enabled = Not Command1.Enabled
Command2.Enabled = Not Command2.Enabled
Exit Sub
End If
If KeyCode = 40 Then
Shape1.Move Shape1.Left + 100, Shape1.Top + 100
End If
End Sub
Lance !
Ici j'ai décidé de faire bouger avec la flêche basse et de changer d'état avec la touche F1
1) tu utilises la flêche basse : rien ne se passe
2) presse F1
3) la flêche basse devient opérationnelle
4) quand tu en as marre : de nouveau F1 ===>> la flêche basse est à nouveau ignorée.
Je n'ai rien d'autre de vraiment intelligent à te proposer
cs_Jack
Messages postés14007Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 sept. 2007 à 18:50
Salut
Chez moi, ça marche très bien :
PrivateSub Form1_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) HandlesMe.KeyDown
If e.KeyCode = Keys.Up Then
Debug.Print("Up")
ElseIf e.KeyCode = Keys.Down Then
Debug.Print("Down")
ElseIf e.KeyCode = Keys.Left Then
Debug.Print("Left")
ElseIf e.KeyCode = Keys.Right Then
Debug.Print("Right")
EndIf
EndSubExplique où est ton problème
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 29 sept. 2007 à 19:21
Bonjour,
Certains contrôles interceptent automatiquement pour leur prope compte la pression des touches Tab et flêches directionnelles, quelle que soit la valeur affectée à la propriété KeyPreview de la Form.
Si tu veux utiliser à tout prix ces flêches, il te faut "ruser" en y adjoignant la touche MAJ ou la touche ALT.
ou rncore t'y prendre autrement (appel de fonctions de l'Api de Windows pour intercepter et faire autrement que prévu par VB et le système), mais cela me parait à la fois démesuré et gauche
Vous n’avez pas trouvé la réponse que vous recherchez ?
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 29 sept. 2007 à 20:40
Je n'ai pas essayé, mais il me semble que ceci devrait pouvoir "marcher" :
1) choix d'une touche pour inhiber les contrôles "preneurs" (CommanButtons, OptionButtons et CheckBoxes)
2) Dans cet état, la prppriété KeyPreview ne devrait plus être gênér par leur présence et tes flêches directionnelles seront reconnues
3) A la fin de cette période, rétablir l'accessibilité des contrôles inhibés.
En d'autres termes : choisir une touche (ou ) permettant de passer ton application d'un stade à l'autre, si tu vois ce que je veux dire. Une seule touche, utilisée en "switch"/True/false devrait d'ailleurs largement suffire.
Arnal88
Messages postés96Date d'inscriptionsamedi 21 octobre 2006StatutMembreDernière intervention25 avril 2009 29 sept. 2007 à 21:04
Merci pour vos propositions.
Si je résume, voici ce que vous me proposez :
- Mettre Form.KeyPreview = True pour concentrer tous les événements KeyDown vers Form_KeyDown
- Définir une combinaison de touches (par exemple Alt-Espace) pour commencer à jouer. On inactive alors tous les contrôles qui captent les touches de direction (Button, RadioButton...)
- On peut alors avoir l'événement KeyDown avec les touches de direction.
- Quand on arrête de jouer, on réactive les contrôles (en appuyant à nouveau sur Alt-Espace par exemple)
Cela marche, mais c'est pas simple...
Mais apparemment, il n'y a pas d'autre possibilités... (merci Microsoft pour tant de simplicité !!)
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 29 sept. 2007 à 21:11
Bon...
Tu peu bien évidemment (ce sera peut-être plus élégant) utiliser un label avec caption = "jouer" puisque un label accepte le click (sans toutefois intercepter les touches directionnelles) pour changer d'état.
C'est plus "visuel" que l'emploi de F1.
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 29 sept. 2007 à 22:33
Une autre solution, enfin, mais à la condition que les seuls "gêneurs" sur ta Form soient des CommandButtons et qu'il n'y en ait pas d'autres (CheckBoxes ou OptionButtons, par exemple) :
Substituer à tes CommandButtons des PictureBoxes (elle acceptent le click et le double-Click sans toutefois intercepter les flêches directionnelles)