Votre premier jeu Windows - C++/DirectX
 |
5 WinMain()
Une fonction obligatoire : cette fonction est appellé par Windows au lancement de notre application, vous allez voir, elle n'est pas bien compliqué !
5.1 Listing
Listing 5.1.1 : WinMain() (ouvrir dans une nouvelle fenêtre)
 |  |  | 1 | | int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) | 2 | | { | 3 | | MSG msg; | 4 | | | 5 | | if ( InitApp(hInstance, nCmdShow) != DD_OK ) | 6 | | return FALSE; | 7 | | | 8 | | while ( TRUE ) | 9 | | { | 10 | | if ( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) ) | 11 | | { | 12 | | if ( !GetMessage(&msg, NULL, 0, 0) ) | 13 | | return msg.wParam; | 14 | | TranslateMessage(&msg); | 15 | | DispatchMessage(&msg); | 16 | | } | 17 | | else if ( bActive ) | 18 | | { | 19 | | DoKeyboardAction(); | 20 | | DoMouseAction(); | 21 | | UpdateFrame(); | 22 | | } | 23 | | else | 24 | | { | 25 | | // Make sure we go to sleep if we have nothing else to do | 26 | | WaitMessage(); | 27 | | } | 28 | | } | 29 | | } |
5.2 Explications détaillées
En ligne 1 nous déclarons notre fonction, il s'agit d'une fonction de type int PASCAL ou WINAPI. Voici les arguments :
- HINSTANCE hInstance : L'handle de l'instance courante. Un handle est une variable qui identifie un objet ; une référence indirecte à une ressource du système d'exploitation
- HINSTANCE hPrevInstance : L'handle de la précédente instance
- LPSTR lpCmdLine : Un pointeur vers la ligne de commande de notre application (afin de pouvoir lire, éventuellement les options passées à notre application)
- INT nCmdShow : Le status de la fenêtre, spécifie comment notre fenêtre doit être vue
En ligne 3, nous déclarons une variable locale de type MSG nommé msg. MSG est un type prédéfini de Windows, il s'agit d'une structure contenant les valeurs nécessaires à un message Windows (comme ceux que nous gérons dans notre fonction WindowProc(), plus haut).
En ligne 5, nous appellons la fonction d'initialisation de notre application nommé InitApp() que nous avons détaillé plus haut. Si cette dernière ne retourne pas la valeur DD_OK nous retournons la valeur FALSE qui aura pour effet d'arreter notre application.
Ligne 8, nous démarrons la boucle infinie de notre application avec while ( TRUE ), elle ne s'arretera pas avant que nous retournions une valeur.
Ligne 10, nous testons si nous avons un message de Windows à lire, si oui, nous essayons de le prendre en ligne 12, si la capture échoue, nous retournons msg.wParam en ligne 13 et laissons Windows décider de que faire de ce message. Si l'on a pû obtenir le message nous le traduisons en une chaine de caractères avec la fonction TranslateMessage() en ligne 14 puis nous le "dispatchons" (ligne 15) en une procédure Windows, si cette procédure est gérée par notre fonction WindowProc() (voir plus haut) elle effectura l'action définit, sinon elle laissera Windows décider.
Si nous arrivons en ligne 17, cela signifie que nous n'avons pas de message à lire, nous testons alors si notre application est active (le focus de la fenêtre est activé) grace à la valeur de bActive que nous définissons dans la fonction WindowProc(). Si elle est bien active nous appellons la fonctions DoKeyboardAction() (ligne 19) et DoMouseAction() (ligne 20), enfin UpdateFrame(). Nous parlerons de ces trois fonctions plus loin. Si l'application n'est pas active (ligne 23), nous attendons un message avec WaitMessage() (ligne 26) tel que WM_SETFOCUS, WM_DESTROY, etc. destiné à notre application, une fois reçu nous recommençons alors la boucle.
|
|  |
 |