fichier PowerPoint - Charlie-Soft

Download Report

Transcript fichier PowerPoint - Charlie-Soft

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 Win32 (et non plus console)
 Avoir une adresse où envoyer les messages
 Avoir une fonction qui les traites
8
Un projet Win32
 Premier changement :
 Pas de void main()…
 A la place, un truc de barbare :
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
9
Un projet Win32
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 WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
10
Un projet Win32
 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 WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
11
Un projet Win32
 Premier changement : Un héritage des Shadocks :
Tout simplement un char*
 Pas de void main()…
 A la place, un truc de barbare :
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
12
Un projet Win32
 Dessiner une fenêtre (new Ressource File .rc):
13
Un projet Win32
 Créer puis afficher la fenêtre
 HWND hDlg;
hDlg = CreateDialog(hInstance,
(LPCTSTR) IDD_DIALOG1,
NULL,
(DLGPROC) MainProc);
14
Un projet Win32
 Créer puis afficher la fenêtre
 HWND hDlg;
hDlg = CreateDialog(hInstance,
(LPCTSTR) IDD_DIALOG1,
NULL,
Un pointeur sur le programme
(DLGPROC) MainProc);
principal. Cela permet de
savoir a quel programme
appartient la fenêtre.
15
Un projet Win32
Un pointeur sur la fenêtre
créé précédemment (dispo
dans ressource)
 Créer puis afficher la fenêtre
 HWND hDlg;
hDlg = CreateDialog(hInstance,
(LPCTSTR) IDD_DIALOG1,
NULL,
(DLGPROC) MainProc);
16
Un projet Win32
 Créer puis afficher la fenêtre
 HWND hDlg;
hDlg = CreateDialog(hInstance,
(LPCTSTR) IDD_DIALOG1,
NULL,
(DLGPROC) MainProc);
Un pointeur sur la fenêtre
mère (ici aucune) de type
HWND
17
Un projet Win32
 Créer puis afficher la fenêtre
 HWND hDlg;
hDlg = CreateDialog(hInstance,
(LPCTSTR) IDD_DIALOG1,
NULL,
(DLGPROC) MainProc);
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
 MainProc...
 Ce pointeur sur une fonction oblige le programmeur à
créer une fonction MainProc :
LRESULT CALLBACK MainProc(HWND Dlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
20
Un nouvelle forme de fonctions
 MainProc...
 Ce pointeur sur une fonction oblige le programmeur à
créer une fonction MainProc :
LRESULT CALLBACK MainProc(HWND Dlg,
UINT message,
WPARAM wParam,
Nouveauté propre aux
LPARAM lParam)
pointeurs sur fonction.
21
Un nouvelle forme de fonctions
 MainProc...
 Ce pointeur sur une fonction oblige le programmeur à
créer une fonction MainProc :
LRESULT CALLBACK MainProc(HWND Dlg,
UINT message,
WPARAM wParam,
Pointeur sur la fenêtre
LPARAM lParam)
qui reçoit les messages
22
Un nouvelle forme de fonctions
 MainProc...
 Ce pointeur sur une fonction oblige le programmeur à
créer une fonction MainProc :
LRESULT CALLBACK MainProc(HWND Dlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
Type du message, voir :
http://msdn2.microsoft.com/en-us/library/ms674668.aspx
23
Un nouvelle forme de fonctions
 MainProc...
 Ce pointeur sur une fonction oblige le programmeur à
créer une fonction MainProc :
LRESULT CALLBACK MainProc(HWND Dlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
Paramètres du message…
24
Un nouvelle forme de fonctions
Il ne reste plus qu’a faire le contenu de la fonction
LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
int Select;
switch(message)
{
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
case IDOK:
EndDialog(Dlg,0);
PostQuitMessage(0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg,Select);
PostQuitMessage(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(GetMessage(&msg,NULL,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
26