OpenGL : l'input avec Windows

Introduction

Jusqu'à maintenant, nous avons fait pas mal de trucs, tous toujours plus beaux les uns que les autres, mais nous n'avons jamais pu vraiment contrôler les objets. Ce que nous faisions de mieux c'était tourner autour plus ou moins vite et puis c'est tout. En plus la vitesse de rotation dépendait de la vitesse d'affichage, et vu que c'était prévu pour tourner de façon fluide en software, on distinguait plus grand chose avec une GeForce... Nous allons donc apprendre comment gérer les interactions utilisateurs : souris, clavier, et pourquoi pas tablette graphique. Il n'y aura pas de code OpenGL spécifique dans ce tutorial, mais vous pourrez l'utiliser pour modifier les exemples des tuts précédents.

 

1. Généralités

Bon, vous aurez compris que les interactions se gèrent comme le reste : grâce aux messages envoyés à la WinProc. Donc tout ce que nous allons faire c'est lister les messages qui nous intéressent.

 

2. Le clavier

Le principal message concernant le clavier est WM_CHAR. Le caractère est contenu dans wParam (à convertir en TCHAR). Ce message n'est pas généré directement, mais c'est une traduction du message WM_KEYDOWN. Ce dernier gère tous les messages provenant du clavier, même les touches étendues. Si la touche est une touche ASCII normale, alors TranslateMessage() génèrera un message WM_CHAR à partir du WM_KEYDOWN, pour que le message soit plus simple à gérer. Si vous n'appelez pas TranslateMessage(Msg) pour chaque message, vous devrez gérer tous les messages provenant du clavier à travers le message WM_KEYDOWN. Pour ce message, wParam contient le code de la touche virtuelle enfoncée. Voici la liste des touches virtuelles possibles :

VK_LBUTTON (bouton gauche de la souris)
VK_RBUTTON (bouton droit de la souris)
VK_MBUTTON (bouton milieu de la souris)
VK_CANCEL
VK_BACK
VK_TAB
VK_CLEAR
VK_RETURN
VK_SHIFT
VK_CONTROL
VK_MENU (Alt)
VK_PAUSE
VK_CAPITAL (Caps Lock)
VK_ESCAPE
VK_SPACE
VK_PRIOR (Page Up)
VK_NEXT (Page Down)
VK_END
VK_HOME
VK_LEFT
VK_UP
VK_RIGHT
VK_DOWN
VK_SELECT (???)
VK_EXECUTE (???)
VK_SNAPSHOT (Print Screen)
VK_INSERT
VK_DELETE
VK_HELP
VK_0, ... , VK_9
VK_A , ... , VK_Z
VK_LWIN (touche 'Windows' gauche - pour les claviers windows)
VK_RWIN (touche 'Windows' droite - pour les claviers windows)
VK_APPS (touche 'Apps' - pour les claviers windows)
VK_NUMPAD0, ... , VK_NUMPAD9
VK_MULTIPLY (*)
VK_ADD (+)
VK_SUBTRACT (-)
VK_DECIMAL (.)
VK_DIVIDE (/)
VK_F1, ... , VK_F24
VK_NUMLOCK
VK_SCROLL (Scroll Lock)
VK_ATTN (???)
VK_CRSEL (???)
VK_EXSEL (???)
VK_EREOF (???)
VK_PLAY (???)
VK_ZOOM (???)
VK_NONAME (???)
VK_PA1 (???)
VK_OEM_CLEAR (???)

Les touches sans parenthèses se passent de commentaires, celles commentées par (???) ne sont pas spécifiques aux claviers standards PC.

Vous aurez aussi remarqué que les clics de souris peuvent aussi être gérés grâce aux touches virtuelles : le message WM_KEYDOWN n'est donc pas un simple message clavier, mais gère aussi pas mal de touches spéciales.

 

3. La souris

Là par contre y'a pas mal de messages. Voici la liste des messages utiles :

  • WM_LBUTTONDBLCLK, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDBLCLK, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_RBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_MOUSEMOVE : Ces messages se comprennent d'eux-mêmes. Les valeurs de wParam et lParam sont les mêmes pour tous : wParam contient les autres touches appuyés en même temps : MK_CONTROL, MK_SHIFT ... et MK_LBUTTON, MK_MBUTTON, MK_RBUTTON. LOWORD(lParam) et HIWORD(lParam) renvoient quand à eux les coordonnées x et y du curseur.
  • WM_MOUSEWHEEL : C'est à peu près la même chose que pour WM_MOUSEMOVE, sauf que là les touches parallèles sont stockées dans LOWORD(wParam), et HIWORD(wParam) contient la valeur de la rotation de la molette.

Il y en a quelques autres, mais ils ne sont pas suffisamment utiles pour être présentés ici, et de toute façon vous avez la liste de tous les messages dans l'aide de VC++.

Ben voilà c'est déjà terminé. Pas de source à télécharger aujourd'hui, puisqu'on a rien vu de particulier niveau OpenGL.

Antoche
 


← L'input avec GLUT↑ Tutoriaux OpenGL ↑