Les accélérateurs clavier

 

 

Accélérateurs:

Un raccourcies clavier est utilisé avec un menu. Il s'agit en fait d'avoir un raccourcie au clavier qui simulerait un clique sur une option de menu. Ce qui permet à un utilisateur d'aller plus vite dans ses manipulations. C'est pourquoi on parlera d'accélérateurs clavier.

Afin d'éviter au développeur quelques déboires et de ne pas réinventer la roue, il existe des fonctions qui vont permettre :

  • D'associer une combinaison de touches à un évènement,
  • De traiter automatiquement un message de touche de clavier pour le traduire en évènement du menu correspondant.

Ce qui va permettre d'avoir qu'un et un seul code répondant à un évènement, et donc de simplifier la maintenance du code.

 

Qu'aurions nous fait ?

Pour faire un raccourcie clavier, nous aurions pu faire:

- Intercepter les messages du clavier

- Si la combinaison de touches correspond à un raccourcie, alors envoyer par SendMessage l'évènement du menu correspondant.

Eh bien, ce sera le même principe, mais de manière plus simple:

 

Associer une combinaison de touches à un évènement:

Tout comme pour les menus, vous passerez par un fichier de ressources (.rc). Ce fichier de ressources sera le même que celui dans lequel vous avez déjà défini les menus.

Pour compléter ce fichier de ressource, vous passerez là aussi par Microsoft ou Dev-C++ qui se chargera alors de tout faire automatiquement,

 

ou vous pouvez aussi saisir les informations à la main en retenant que les accélérateurs clavier sont définis de la manière suivante:

Tout d'abord indiquer la section accélérateur:

<Nomressourceaccélérateur> ACCELERATORS
BEGIN

...

END

Puis entre BEGIN et END, indiquer la liste des touches accélérateurs et l'évènement associé:

<touche>, <Evènement>, <combinaison>

Où touche : Peut être une lettre ou un chiffre entre guillemet ou un code touche virtuelle VK_

Evènement : Evènement du menu (IDM_)

combinaison qui peut être CONTROL, SHIFT, ALT, VIRTKEY, ASCII (On utilisera la virgule pour combiner les touches.

Voici un exemple généré par Microsoft:

IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE
BEGIN
"P", ID_EDIT_COPY, VIRTKEY, SHIFT, CONTROL, ALT, NOINVERT
END

Je ne sais pas à quoi sert NOINVERT.

 

Utiliser notre définition d'accélérateurs:

HACCEL haccel;

haccel = LoadAccelerators(hinstance, "Nomressourceaccélérateur");

Grace à cette fonction, nous allons pouvoir récupérer un handle sur la définission des accélérateurs. Ceci restant la méthode la plus souvent utilisée.

Si vous avez utilisé par exemple VisualC++ pour définir vos accélérateur, alors vous obtiendrez un identificateur et non un nom d'accélérateur.

Dans ce cas, ne pas oublier d'utiliser la macro MAKEINTRESOURCE(). Classique maintenant...

Par exemple l'id généré est IDR_ACCELERATOR1 donne:haccel = LoadAccelerators(hinstance, MAKEINTRESOURCE(IDR_ACCELERATOR));

 

Pour terminer, il faut maintenant que l'appuie sur une touche accélérateur déclenche notre option de menu:

Il nous suffira pour cela de modifier la partie de code en boucle sur la lecture des messages de la manière suivante:

while (GetMessage(&msg, NULL, 0, 0))
{
     if (!TranslateAccelerator(hwnd, haccel, &msg))
     {
	     TranslateMessage(&msg);
	     DispatchMessage(&msg);
     }
}


La fonction TranslateAccelerator () va traiter en premier le message qui vient d'arriver. S'il s'agit d'un message de raccourcie clavier, il le traitera automatiquement en envoyant l'évènement correspondant à notre procédure de message. La fonction retournera alors TRUE pour indiquer que le message est déjà traité. Il nous faudra donc tester la valeur en retour. Si la valeur est FALSE, cela implique un traitement "traditionnel" du message.