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.