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