La programmation systme Window 1 Les bases de
La programmation système Window$ 1
Les bases de Windows �C’est un Système d’Exploitation (OS) �Fonctionnement proche de Linux sur certain points � Priorités � Chargement en mémoire des processus �De grandes différences sur d’autres points � Le système de fenêtres � Les processus � Les messages 2
Pourquoi Windows ? �Linux c’est bien, mais : �C’est pas utilisé partout �Il n’y a pas de drivers pour tout (cartes de com réseau…) �C’est plus compliqué �Windows c’est bien parce que : �Vous connaissez bien �On peut faire des choses jolies vite fait 3
Comment marche Window$ ? �C’est un fonctionnement nouveau : �La programmation événementielle �En effet, l’ordinateur reçoit des événements tout le temps : �La souris qui bouge �Une touche d’appuyée �Une clé USB de branchée �L’écran de veille qui se déclenche �Redimension de la fenêtre… 4
Programmation événementielle �Avant : �On attendait qu’un événement arrive : � cin : on attend que l’utilisateur écrive quelque chose �Puis on exécutait les instructions qu’il fallait �Mais des mécanismes étaient cachés : �Pourquoi le programme quitte quand on clique sur ? �Pourquoi on peut minimiser la fenêtre ? �Pourquoi cin donne la valeur quand on appuie sur entrée ? 5
Programmation événementielle �Maintenant : �On reçoit un événement (une touche appuyée par exemple) �On traite l’événement �On attend que d’autres événements arrivent (sauf si l’événement était un click sur la croix…) 6
Programmation événementielle �Là où on comprend le pourquoi du comment �Si dans le traitement d’un message on a une boucle infini, on ne peut plus traiter les autres messages �On ne peut plus alors : � Fermer la fenêtre � Rafraichir l’affichage � La redimensionner � Utiliser les boutons �… 7
Programmation événementielle �Pour pouvoir recevoir des messages, il faut �Inclure les définitions des messages : #include <Windows. h> �Faire un projet Win 32 (et non plus console) �Avoir une adresse où envoyer les messages �Avoir une fonction qui les traites 8
Un projet Win 32 �Premier changement : �Pas de void main()… �A la place, un truc de barbare : int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) { 9
Un projet Win 32 Mot clé pour préciser au �Premier changement : compilateur que c’est le point �Pas de void main()… d’entrée du programme �A la place, un truc de barbare : int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) { 10
Un projet Win 32 �Premier changement : Type très important : C’est ce qui permet d’identifier de �Pas de void main()… manière unique une fenêtre �A la place, un truc de barbare : int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) { 11
Un projet Win 32 �Premier changement : Un héritage des Shadocks : �Pas de void main()… Tout simplement un char* �A la place, un truc de barbare : int APIENTRY Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPSTR lp. Cmd. Line, int n. Cmd. Show) { 12
Un projet Win 32 �Dessiner une fenêtre (new Ressource File. rc): 13
Un projet Win 32 �Créer puis afficher la fenêtre �HWND h. Dlg; h. Dlg = Create. Dialog(h. Instance, (LPCTSTR) IDD_DIALOG 1, NULL, (DLGPROC) Main. Proc); 14
Un projet Win 32 �Créer puis afficher la fenêtre �HWND h. Dlg; h. Dlg = Create. Dialog(h. Instance, (LPCTSTR) IDD_DIALOG 1, NULL, Un pointeur sur le programme (DLGPROC) Main. Proc); principal. Cela permet de savoir a quel programme appartient la fenêtre. 15
Un projet Win 32 Un pointeur sur la fenêtre créé précédemment (dispo dans ressource) �Créer puis afficher la fenêtre �HWND h. Dlg; h. Dlg = Create. Dialog(h. Instance, (LPCTSTR) IDD_DIALOG 1, NULL, (DLGPROC) Main. Proc); 16
Un projet Win 32 �Créer puis afficher la fenêtre �HWND h. Dlg; h. Dlg = Create. Dialog(h. Instance, (LPCTSTR) IDD_DIALOG 1, NULL, (DLGPROC) Main. Proc); Un pointeur sur la fenêtre mère (ici aucune) de type HWND 17
Un projet Win 32 �Créer puis afficher la fenêtre �HWND h. Dlg; h. Dlg = Create. Dialog(h. Instance, (LPCTSTR) IDD_DIALOG 1, NULL, (DLGPROC) Main. Proc); Un pointeur sur la fonction qui se charge de traiter les messages 18
Un nouvelle forme de fonctions �Pointeur sur fonction ? ? ? �N’ayez pas peur du mot pointeur, le concept est très simple : �On met le nom de la fonction (sans les paramètres) �A l’exécution, on utilisera la fonction pour traiter les messages �Pas au programme, donc vous n’avez qu’a comprendre comment ça s’utilise �Mais je répondrais à vos questions 19
Un nouvelle forme de fonctions �Main. Proc. . . �Ce pointeur sur une fonction oblige le programmeur à créer une fonction Main. Proc : LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) 20
Un nouvelle forme de fonctions �Main. Proc. . . �Ce pointeur sur une fonction oblige le programmeur à créer une fonction Main. Proc : LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, Nouveauté propre aux LPARAM l. Param) pointeurs sur fonction. 21
Un nouvelle forme de fonctions �Main. Proc. . . �Ce pointeur sur une fonction oblige le programmeur à créer une fonction Main. Proc : LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, Pointeur sur la fenêtre LPARAM l. Param) qui reçoit les messages 22
Un nouvelle forme de fonctions �Main. Proc. . . �Ce pointeur sur une fonction oblige le programmeur à créer une fonction Main. Proc : LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) Type du message, voir : http: //msdn 2. microsoft. com/en-us/library/ms 674668. aspx 23
Un nouvelle forme de fonctions �Main. Proc. . . �Ce pointeur sur une fonction oblige le programmeur à créer une fonction Main. Proc : LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) Paramètres du message… 24
Un nouvelle forme de fonctions � Il ne reste plus qu’a faire le contenu de la fonction LRESULT CALLBACK Main. Proc(HWND Dlg, UINT message, WPARAM w. Param, LPARAM l. Param) { int Select; switch(message) { case WM_COMMAND: Select=LOWORD(w. Param); switch(Select) { case IDOK: End. Dialog(Dlg, 0); Post. Quit. Message(0); return TRUE; case IDCANCEL: End. Dialog(Dlg, Select); Post. Quit. Message(0); return TRUE; } default: return FALSE; } } 25
Programmation événementielle � Il ne reste plus qu’une chose : dispatcher les messages � Dans le main, à la fin, mettre : MSG msg; while(Get. Message(&msg, NULL, 0, 0)==TRUE) { Translate. Message(&msg); Dispatch. Message(&msg); } return 0; 26
- Slides: 26