Gestion des périphériques

Transcription

Gestion des périphériques
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
Gestion des périphériques
Leçon N°1 : Gestion avec les
Message Windows
Année universitaire
2004-2005
Pascal Mignot
[email protected]
U N IVERSIT É
D E R EIMS
Gestion des périphériques
C H AMP AGN E-A RD EN N E
Objectif:
gérer les entrées du clavier, de la souris ou d'une manette de jeu.
Deux solutions:
• utiliser le gestionnaire de messages.
solution simple et bien adaptée à la gestion de fenêtres mais
essentiellement limitée à la souris et au clavier.
• utiliser DirectInput.
permet d'utiliser n'importe quel périphérique (clavier, souris, pad,
joystick avec force-feedback) à travers une interface générale.
Gestionnaire de message
U N IVERSIT É
D E R EIMS
rappel: prototype du gestionnaire
C H AMP AGN E-A RD EN N E
La fonction de gestion des messages a le prototype suivant:
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT Msg,
WPARAM wParam, LPARAM lParam );
avec
hwnd
référence de la fenêtre (handle).
Msg
message transmis
WParam
LParam
paramètres additionnels du
message
• Les messages qui nous intéressent sont ceux en provenance du
clavier et de la souris.
• Les paramètres additionnels permettent de préciser:
- la touche frappée
- l’action effectuée à la souris.
Gestionnaire de message
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
gestion du périphérique souris 1/3
les messages
Principales valeurs de Msg:
• actions sur les boutons :
bouton gauche
bouton du milieu
bouton droit
appuyé
WM_LBUTTONDOWN
WM_MBUTTONDOWN
WM_RBUTTONDOWN
relaché
WM_LBUTTONUP
WM_MBUTTONUP
WM_RBUTTONUP
double-click
WM_LBUTTONDBLCLK
WM_MBUTTONDBLCLK
WM_RBUTTONDBLCLK
• déplacement: WM_MOUSEMOVE
• utilisation de la molette: WM_MOUSEWHEEL
Attention pour la gestion des doubles-clicks: penser à ajouter
CS_DBLCLKS au champ style de la structure WNDCLASSEX fenêtre
avant de la passer à RegisterClassEx().
Gestionnaire de message
gestion du périphérique souris 2/3
modificateur d'action
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
une touche du clavier ou un bouton peut être appuyée en même temps
que l'on clique ou que l'on déplace la souris.
Lors d’une action (par exemple WM_MOUSEMOVE), utiliser:
GET_KEYSTATE_WPARAM(wParam)
et la comparer avec:
MK_CONTROL
Ctrl
MK_LBUTTON
bouton gauche
MK_MBUTTON
bouton du milieu
MK_RBUTTON
bouton droit
MK_SHIFT
Shift
MK_XBUTTON1
x-bouton 1
MK_XBUTTON2
x-bouton 2
afin de déterminer si l'une de ces touches virtuelles est active en même
temps que l'action spécifiée par le message.
Gestionnaire de message
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
gestion du périphérique souris 3/3
déplacements
• position de la souris: les
coordonnées absolues de la souris
dans la fenêtre courante sont
contenues dans:
coordonnée x :
Fenêtre courante
y
GET_X_LPARAM(lParam)
coordonnée y :
GET_Y_LPARAM(lParam)
●
x
état de la molette (cas WM_MOUSEWHEEL):
le déplacement relatif de la molette est contenue dans:
GET_WHEEL_DELTA_WPARAM(wParam)
Note: peut nécessiter l’inclusion de WindowsX.h et zmouse.h.
Bureau
Gestionnaire de message
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
gestion du périphérique clavier (1/2)
message et touches
• Valeur de MSG: WM_KEYDOWN est envoyé lorsqu'une touche est
appuyée.
• Touche appuyée: wParam contient la valeur de la touche virtuelle
appuyée.
• Tables des touches virtuelles (définie dans le fichier Winuser.h):
comparer wParam à l'une des constantes suivantes:
Touches "classiques"
Modificateurs
'x'
touche x (x=A…Z ou 0…9)
VK_Fx
touche de fonction Fx (x=1…24)
VK_NUMPADx
touche x du pavé numérique (x=ou 0…9)
VK_SHIFT
shift +
VK_CONTROL
control +
VK_CAPITAL
majuscule activé
VK_NUMLOCK
pavé num. activé.
Gestionnaire de message
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
gestion du périphérique clavier (2/2)
table des touches virtuelles (suite)
Touches spéciales
Boutons de la souris
VK_SPACE
espace
VK_LBUTTON
bouton gauche
VK_PRIOR
page précédente
VK_MBUTTON
bouton du milieu
VK_NEXT
page suivante
VK_RBUTTON
bouton droit
VK_HOME
début
VK_END
fin
VK_LEFT
flèche gauche
VK_RIGHT
flèche droite
VK_LSHIFT
Shift gauche
VK_UP
flèche haut
VK_RSHIFT
Shift droit
VK_DOWN
flèche bas
VK_LCONTROL
Ctrl gauche
VK_INS
insérer
VK_RCONTROL
Ctrl droit
VK_DEL
effacer à droite
VK_LMENU
Alt gauche
VK_ENTER
entrée
VK_RMENU
Alt droit
VK_TAB
tabulation
VK_BACK
effacer à gauche
Modificateurs indépendants
(cette table est incomplète)
Gestionnaire de message
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
gestion de périphériques - Exemple
LONG
dx,dy;
BOOL
mousing;
LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static POINT MousePos;
switch( msg ) {
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: // mouvement avec le bouton gauche de la souris appuyé
mousing = TRUE; // pas de break ici pour poursuivre sur WM_MOUSEMOVE
case WM_MOUSEMOVE:
// déplacement relatif
dx = GET_X_LPARAM(lParam) – MousePos.x;
dy = GET_Y_LPARAM(lParam) – MousePos.y;
// mise-à-jour de la position
MousePos.x = GET_X_LPARAM(lParam);
MousePos.y = GET_Y_LPARAM(lParam);
break;
case WM_LBUTTONUP:
mousing = FALSE;
break;
// traiter ici les autres messages
…
}}
Action à la souris: utiliser les informations recueillies ici pour mettre à jour
les transformations dans la boucle de rendu.
Lectures et codes
U N IVERSIT É
D E R EIMS
C H AMP AGN E-A RD EN N E
Compléments:
voir la doc MSDN.
Codes:
ceux déjà présents sur le serveur incluent
cette gestion.