Procédure de gestion des messages
La procédure associée à une fenêtre
pour gérer ces messages est généralement
appelée WndProc.
Sa définition est la suivante:
LRESULT CALLBACK WndwProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam);
Cette fonction reçoit le handle de la fenêtre à laquelle est associée l'évènement reçu.
Puis l'identificateur d'un message suivi éventuellement d'informations complémentaires suivant le type du message qui seront passées dans wParam et/ou lParam.
Je ne parlerai ici que des messages les plus courant. D'autres messages seront vus au fil des chapitres.
Le premier des messages sera WM_CREATE:
Ce message est reçu lorsque votre fenêtre est créée (CreateWindow/CreateWindowEx). C'est ici que vous pourrez initialiser tout ce qui sera nécessaire à votre application pour cette fenêtre.
Le second, la destruction d'une fenêtre:
Cette information va indiquer que l'utilisateur veut quitter l'application. On pourra donc faire des tâches de "fin du traitement". Cependant, nous avons vu précédemment quel'application était rentrée dans une boucle de lecture de la file de messages dans la fonction WinMain(). Il nous faut donc y mettre fin. La seule solution étant d'envoyer un WM_QUIT. C'est le rôle de la fonction PostQuitMessage que l'on doit impérativement mettre ici ! (Voir l'exemple ci-après)
VOID WINAPI PostQuitMessage(
int nExitCode
);
Avec nExitCode, la valeur que l'application doit retourner en rendant la main au système.
Enfin, il y a un autre message important : WM_PAINT
C'est lui qui nous informe que la zone client doit être redessinée. Je reviens dessus dans le chapitre sur le GDI.
Ce qu'il faut savoir, c'est qu'il faut impérativement mettre BeginPaint() et EndPaint() avec ce message. En effet, c'est la fonction EndPaint qui va informer Windows que la zone client est de nouveau valide. Tant que cette fonction ne sera pas appelée, Windows retournera un message WM_PAINT !
Pour les messages que vous ne voulez pas traiter, il faudra laisser Windows faire l'action par défaut associée au message en question.
Il suffira d'ajouter la ligne de code:
return DefWindowProc (hwnd, message, wParam, lParam);
DefWibndowProc étant la procédure de gestion des messages par défaut...
return pour DefWindowProc, mais aussi pour tous les autres messages, n'oubliez pas que la fonction est censée retourner quelque chose, même si derrière tout le monde s'en fiche...
Généralement les messages sont traités avec une instruction switch case comme dans l'exemple ci-dessous: