Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DIRECTX TUTO 9 : DIRECTINPUT LA SOURIS ....


Information sur la source

Catégorie :ASP Niveau : Initié Date de création : 22/09/2004 Date de mise à jour : 23/09/2004 19:32:50 Vu / téléchargé: 11 439 / 525

Note :
9,75 / 10 - par 4 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

Description

Pour ce 9eme tuto, je vous propose la gestion de la souris, sous directx, je ne repars bien sur pas du début, mais je ne donnerais ici que ce qui est nécessaire. J'ai mis comme toujours une source accompagnée de ses commentaires.
 

Source

  • 'Dans ce 9e tutoriel, je pars sur la base que vous savez afficher une image par Direct Draw.
  • ' Donc, partons dans le vif du sujet. Il vous faut donc avoir déclaré DirectX, DirectDraw, normalement. Ensuite vous rajoutez ces variables :
  • Public dInput As DirectInput ' Déclaration de DirectInput pour relever sous DirectX les entrées.
  • Public diMouse As DirectInputDevice ' Ici un device pour DirectInput
  • Public SourisX As Long ' Les coordonnées de la souris en X
  • Public SourisY As Long ' Les coordonnées de la souris en Y
  • ' Declaration d'une surface pour l'image du curseur
  • Public CurseurSouris As DirectDrawSurface7
  • Dim ddsdCurseurSouris As DDSURFACEDESC2
  • ' Couleur transparente
  • Dim ck As DDCOLORKEY
  • Ensuite il faut initialiser tout ce petit monde :
  • Juste 5 petites lignes pour pouvoir utiliser la souris.
  • Set dInput = dx.DirectInputCreate() ' Initialisation de DirectInput
  • Set diMouse = dInput.CreateDevice("Guid_sysMouse") ' Création du device de type Mouse (souris)
  • diMouse.SetCommonDataFormat DIFORMAT_MOUSE ' Format de la souris
  • ' on définit un niveau de coopération tel qu'il soit ou exclusif ou en premier plan
  • diMouse.SetCooperativeLevel Form1.hWnd, DISCL_EXCLUSIVE Or DISCL_FOREGROUND
  • diMouse.Acquire ' Dernière chose on capture la souris
  • Pour ce qui ne se rappelle pas, on définit notre image de curseur et notre colorkey (couleur transparente) comme ceci :
  • ' ColorKey
  • ck.low = RGB(255, 255, 255)
  • ck.high = RGB(255, 255, 255)
  • 'Image curseur
  • Set CurseurSouris = dd.CreateSurfaceFromFile(App.Path & "\curseur.bmp", ddsdCurseurSouris)
  • CurseurSouris.SetColorKey DDCKEY_SRCBLT, ck
  • Nous allons utilisé une fonction Souris qui nous permettra d'affiché le curseur et de capturé les appuies sur les boutons :
  • ' Déclaration de la fonction
  • Public Function Souris()
  • ' Ici on initialise la récupération du statut de la souris :
  • ' Déclaration d'une variable pour récupérer le statut de la souris
  • Dim MouseState As DIMOUSESTATE
  • ' Récupération du statut de la souris dans notre variable
  • diMouse.GetDeviceStateMouse MouseState
  • ' Ensuite on définit des limites à ne pas dépasser pour pas que le curseur dépasse les bords de l'écran
  • ' (SourisX + MouseState.x) >= 0) Si la position de la souris en x est supérieur ou égal à 0
  • ' (SourisX + MouseState.x) < (640 - LargeurCurseur) Si la position de la souris est inférieur à la largeur de l'écran moins la largeur de notre curseur
  • ' (SourisY + MouseState.y) >= 0) Si la position de la souris en y est supérieur ou égal à 0
  • ' (SourisY + MouseState.y) < (480 - HauteurCurseur)) Si la position de la souris en y est inférieur à la hauteur de l'écran moins la hauteur de notre curseur
  • ' Bloque conditionnel :
  • If ((SourisX + MouseState.x) >= 0) And ((SourisX + MouseState.x) < (640 - 32)) And ((SourisY + MouseState.y) >= 0) And ((SourisY + MouseState.y) < (480 - 51)) Then
  • ' Calcul de la position de la souris
  • SourisX = SourisX + MouseState.x ' Ajout de la nouvelle position à l'ancienne, car au 'départ SourisX = 0 donc 0 + 10 vers la droite = 10 mais si on ne mettait pas l'addition sa
  • 'Ferais 0 + 10 =10
  • 'deuxième mouvement SourisX=10 mais sans l'addition SourisX passe à 0 donc boucle de non
  • «-déplacement.
  • SourisY = SourisY + MouseState.y ' Ajout de la nouvelle position à l'ancienne, car au
  • 'départ SourisY = 0
  • End If
  • ' Appuis sur un des boutons de la souris, donc on utilise MouseState.buttons()
  • ' si buttons(0) c'est bouton gauche, si buttons(1) = droite, si buttons(2) = centre
  • If MouseState.buttons(0) <> 0 Then ' Si on appuis sur le bouton de gauche
  • Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite ' On affiche le fond en blanc
  • Backbuffer.DrawText 10, 10, "Gauche", False ' On affiche le texte : Gauche
  • End If
  • If MouseState.buttons(1) <> 0 Then ' Si on appuis sur le bouton du milieu
  • Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite ' On affiche le fond en blanc
  • Backbuffer.DrawText 10, 10, "Droite", False ' On affiche le texte : Droite
  • End If
  • If MouseState.buttons(2) <> 0 Then ' Si on appuis sur le bouton de droite
  • Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite ' On affiche le fond en blanc
  • Backbuffer.DrawText 10, 10, "Centre", False ' On affiche le texte : Centre
  • End If
  • ' On affiche dans le backbuffer l'image de la souris.
  • Backbuffer.BltFast SourisX, SourisY, CurseurSouris, ddRect(0, 0, 0, 0), DDBLTFAST_SRCCOLORKEY
  • End Function
  • Voila avec ceci vous pouvais afficher un curseur et récupéré l'appui sur les boutons.
'Dans ce 9e tutoriel, je pars sur la base que vous savez afficher une image par Direct Draw.

' Donc, partons dans le vif du sujet. Il vous faut donc avoir déclaré DirectX, DirectDraw, normalement. Ensuite vous rajoutez ces variables :

Public dInput As DirectInput         ' Déclaration de DirectInput pour relever sous DirectX les entrées.
Public diMouse As DirectInputDevice   ' Ici un device pour DirectInput
Public SourisX As Long     ' Les coordonnées de la souris en X
Public SourisY As Long     ' Les coordonnées de la souris en Y

' Declaration d'une surface pour l'image du curseur
Public CurseurSouris As DirectDrawSurface7
Dim ddsdCurseurSouris As DDSURFACEDESC2
' Couleur transparente
Dim ck As DDCOLORKEY

Ensuite il faut initialiser tout ce petit monde :

Juste 5 petites lignes pour pouvoir utiliser la souris.

Set dInput = dx.DirectInputCreate()  ' Initialisation de DirectInput
Set diMouse = dInput.CreateDevice("Guid_sysMouse")   ' Création du device de type Mouse (souris)
diMouse.SetCommonDataFormat DIFORMAT_MOUSE     ' Format de la souris
' on définit un niveau de coopération tel qu'il soit ou exclusif ou en premier plan
diMouse.SetCooperativeLevel Form1.hWnd, DISCL_EXCLUSIVE Or DISCL_FOREGROUND
diMouse.Acquire   ' Dernière chose on capture la souris



Pour ce qui ne se rappelle pas, on définit notre image de curseur et notre colorkey (couleur transparente) comme ceci :

' ColorKey
ck.low = RGB(255, 255, 255)
ck.high = RGB(255, 255, 255)

'Image curseur
Set CurseurSouris = dd.CreateSurfaceFromFile(App.Path & "\curseur.bmp", ddsdCurseurSouris)
CurseurSouris.SetColorKey DDCKEY_SRCBLT, ck

Nous allons utilisé une fonction Souris qui nous permettra d'affiché le curseur et de capturé les appuies sur les boutons :

' Déclaration de la fonction
Public Function Souris()

' Ici on initialise la récupération du statut de la souris :
' Déclaration d'une variable pour récupérer le statut de la souris
Dim MouseState As DIMOUSESTATE
' Récupération du statut de la souris dans notre variable
diMouse.GetDeviceStateMouse MouseState

' Ensuite on définit des limites à ne pas dépasser pour pas que le curseur dépasse les bords de l'écran
' (SourisX + MouseState.x) >= 0)    Si la position de la souris en x est supérieur ou égal à 0
' (SourisX + MouseState.x) < (640 - LargeurCurseur)   Si la position de la souris est inférieur à la largeur de l'écran moins la largeur de notre curseur
' (SourisY + MouseState.y) >= 0)   Si la position de la souris en y est supérieur ou égal à 0
' (SourisY + MouseState.y) < (480 - HauteurCurseur)) Si la position de la souris en y est inférieur à la hauteur de l'écran moins la hauteur de notre curseur

' Bloque conditionnel : 
If ((SourisX + MouseState.x) >= 0) And ((SourisX + MouseState.x) < (640 - 32)) And ((SourisY + MouseState.y) >= 0) And ((SourisY + MouseState.y) < (480 - 51)) Then
    ' Calcul de la position de la souris
    SourisX = SourisX + MouseState.x   ' Ajout de la nouvelle position à l'ancienne, car au 'départ SourisX = 0  donc 0 + 10 vers la droite = 10 mais si on ne mettait pas l'addition sa 
'Ferais 0 + 10 =10
'deuxième mouvement SourisX=10 mais sans l'addition SourisX passe à 0 donc boucle de non 
«-déplacement.
    SourisY = SourisY + MouseState.y    ' Ajout de la nouvelle position à l'ancienne, car au 
'départ SourisY = 0
End If


' Appuis sur un des boutons de la souris, donc on utilise MouseState.buttons()
' si buttons(0) c'est bouton gauche, si buttons(1)  = droite, si buttons(2) = centre

If MouseState.buttons(0) <> 0 Then     ' Si on appuis sur le bouton de gauche
Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite  ' On affiche le fond en blanc
Backbuffer.DrawText 10, 10, "Gauche", False   ' On affiche le texte  : Gauche
End If
If MouseState.buttons(1) <> 0 Then     ' Si on appuis sur le bouton du milieu
Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite   ' On affiche le fond en blanc
Backbuffer.DrawText 10, 10, "Droite", False  ' On affiche le texte  : Droite
End If
If MouseState.buttons(2) <> 0 Then    ' Si on appuis sur le bouton de droite
Backbuffer.BltColorFill ddRect(0, 0, 0, 0), vbWhite    ' On affiche le fond en blanc
Backbuffer.DrawText 10, 10, "Centre", False  ' On affiche le texte  : Centre
End If

' On affiche dans le backbuffer l'image de la souris.
Backbuffer.BltFast SourisX, SourisY, CurseurSouris, ddRect(0, 0, 0, 0), DDBLTFAST_SRCCOLORKEY
End Function

Voila avec ceci vous pouvais afficher un curseur et récupéré l'appui sur les boutons.

Conclusion

Si vous avez un problème d'initialisation de DirectDraw reportez-vous soit au tuto précédent que j'ai fait sur DirectDraw, soit à la source, mais attention dans la source seulement la partie DirectInput est commentée.

Derrière chose, DirectInput sert aussi pour le Joystick et le clavier, j'ai déjà expliqué le clavier dans un des tuto précédent.

Bon code, et n'oublier pas que je suis là pour toute remarque.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

23 septembre 2004 19:32:50 :
Une petite erreur dans le nom du projet, j'avai mis DirectInput se qui ne peux aller car le nom du projet et le nom d'une reference doivent être different.

Commentaires et avis

signaler à un administrateur
Commentaire de bilaloch le 23/09/2004 15:34:01

Tres bon code. 9/10. Mais pour la source il faut changer le nom du projet par quelque chose d'autre que directinput pace que ca marchera pa sans. DirectIput est deja pri par directx.

@ +

BILALoch

signaler à un administrateur
Commentaire de ciberrique le 23/09/2004 19:30:41

Effectivement tu as raison bilaloch, j'ai fait la modification.

Merci pour ta superbe note, mon code n'en vaut pas autant lol..

Merci
a+

signaler à un administrateur
Commentaire de Metos62 le 19/11/2006 14:08:40

Je suis d'avis à dire que c'est un très bon tuto sur la souris sous directx 7, mais j'ai une question : est la molette ?, cerai t'elle non géré par directx ou alors tu n'i as pas pensé ?. Sinon y a pas a dire très bon tuto simple à comprendre!!

signaler à un administrateur
Commentaire de ciberrique le 19/11/2006 15:45:41

Si si directinput gere la molette (roller), j'explique sommairement (a partir de la source ci-dessus):

Position de la souris : MouseState
donc en x : MouseState.x
en y : MouseState.y

Pour la roulette (molette, roller) : MouseState.z

qui donne une position, donc on releve MouseState.Z dans SourisZ et :
if MouseState.Z>SourisZ then   'on roule vers le devant
if MouseState.Z<SourisZ then   'on roule vers l'arriere (euh a verifier pour devant et deriere)

Voila, j'espere avoir répondu convenablement ^^.

signaler à un administrateur
Commentaire de Metos62 le 19/11/2006 16:28:03

NIKEL

c'est vérifier c'est bien "if MouseState.Z>SourisZ then" pour l'avant et l'autre pour l'arrive (je me disais aussi depuis quand les souris gérent le déplacement en hauteur)

Donc un grand merci à toi

signaler à un administrateur
Commentaire de ciberrique le 20/11/2006 00:13:40

De rien, si tu as d'autre question n'hesite pas.

Bon code.

signaler à un administrateur
Commentaire de Edgar43 le 11/11/2007 14:18:34

J'ai vu la réponse pour gérer la molette centrale.
Mais avec une souris à 5 boutons, avec une molette centrale qui peut tourner, être appuyée, mais aussi être basculée vers la gauche ou vers la droite ?
Comment on peut récupérer ces mouvements ?
Je parle d'une souris "à 5 boutons" parce que, quand on fait GetSystemMetrics(SM_CMOUSEBUTTONS), on obtient la valeur 5.
Merci d'avance.

signaler à un administrateur
Commentaire de ciberrique le 11/11/2007 18:35:01

Je ne suis pas sur que direct input le gere...
A voir avec les api windows sinon bien regarder l'aide directx, pour mon cas je n'ai jamais utilisé les sourisa plus de 3 boutons dans un jeu.

signaler à un administrateur
Commentaire de The_Diablange le 19/03/2008 16:06:39

Merci pour tes multiples contributions sur ce site (notamment sur directX). Il semble que des applications comme windows media center et de multiples jeux contraignent la sourie à leur fenetre comme tu l'a expliqué ci dessus. Serait il possible de créer un programme qui désactive les limites d'une autre application ou qui les redéfinis ? (de facon à, par exemple en mode double écran, se libérer de la fenetre du jeu ou du media center et utiliser un programme quelconque sur le second écran)
Merci de ta réponse

signaler à un administrateur
Commentaire de ciberrique le 19/03/2008 17:12:24

Je comprend ta question mais je ne vois pas le rapport avec ce code. J'aimerai savoir a quel moment window media center bloque la souris, pour pouvoir tenter d'apporter une reponse convenable.

Merci pour tes remerciements.

signaler à un administrateur
Commentaire de The_Diablange le 19/03/2008 17:45:32

Il ne bloque pas la souris, il limite la souris au cadre de sa fenetre, donc comme l'application est en plein écran sur l'un des deux écrans, je peux déplacer ma souris sur cet écran mais pas sur le second.

signaler à un administrateur
Commentaire de ciberrique le 19/03/2008 17:49:00

Alors je ne vois pas de solution avec directinput qui pourrais etre satisfaisante. L'idéal serait de hook les mouvements de la souris avec un hook global (voir dll de hook ici sur vbfrance) et ne rediriger que les mouvements de souris qui nous interesse vers windows media center.

Enfin c'est une solution a voir si il y a pas une simple option a decocher avant.

signaler à un administrateur
Commentaire de The_Diablange le 20/03/2008 18:20:45

Oui, j'ai tout regardé du coté des options a décocher ca ne fonctionne pas.
Je vais me pencher sur les hook des mouvements de la souris, merci de ton aide

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.