Voila, j'arrive pas à retrouver de message WM_QUIT dans ma "message loop".
Au lieu de ça, c'est la WindowProc qui réceptionne le message.
Pourtant, mon aide spécifie bien que WM_QUIT est un "Queued message", c'est à dire qu'il doit dabord passer dans la "thread message queue" du programme (excuser l'anglais, mon aide est en anglais et je connais pas les traductions) et donc qu'il doit se faire lire par GetMessage() dans la "Message Loop" de la WinMain.
Concretement, voila ma source :
#include <windows.h>
#include <stdio.h>
/*
* FENETRE - Structure contenant les informations necessaires au programme
* sur une fen^tre.
*/
typedef struct
{
HWND handle; // Handle de la fen^tre.
unsigned long hauteur; // Hauteur de l'espace client.
unsigned long largeur; // Largeur de l'espace client.
RECT rect; // Position de la fen^tre sur le DeskTop.
HDC contexte; // Contexte d'affichage priv, de la fen^tre.
} FENETRE;
FENETRE fenetre;
LRESULT CALLBACK WindowProc
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
long main()
{
HINSTANCE hInstance;
WNDCLASSEX classe;
DWORD style, style_ex;
MSG Msg;
hInstance = GetModuleHandle(NULL);
/*
* D,finition de la classe de fen^tre.
*/
classe.cbSize = 48; // Taille de la structure.
classe.style = 0; // Style.
classe.lpfnWndProc = (WNDPROC)WindowProc; // Fonction de traitement.
classe.cbClsExtra = 0; // Octets suppl,mentaires.
classe.cbWndExtra = 0; // Octets suppl,mentaires.
classe.hInstance = hInstance; // Handle du programme.
classe.hIcon = 0;
classe.hCursor = LoadCursor(NULL, IDC_ARROW); // Curseur utilis,.
classe.hbrBackground = GetStockObject(NULL_BRUSH); // Couleur par d,faut.
classe.lpszMenuName = NULL; // Nom du menu.
classe.lpszClassName = "classe_1"; // Nom de la classe de fen^tre.
classe.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Icone utilis,.
/*
* Enregistrement de la classe.
*/
if(RegisterClassEx(&classe) == 0)
{
return(-100);
}
/*
* Ajustement de la fen^tre sur le DeskTop. (Autrement dit prise en compte
* des bordures qui ne font pas partie de l'espace client.)
*/
fenetre.hauteur = 100; // Largeur de l'espace client.
fenetre.largeur = 150; // Hauteur de l'espace client.
fenetre.rect.left = 50; // Coordonn,e x.
fenetre.rect.top = 50; // Coordonn,e y.
fenetre.rect.right = fenetre.rect.left + fenetre.largeur;
fenetre.rect.bottom = fenetre.rect.bottom + fenetre.hauteur;
style = WS_CAPTION |
WS_SYSMENU; // Style de la fen^tre.
style_ex = 0; // Style ,tendu de la fen^tre.
if
(
AdjustWindowRectEx
(
&fenetre.rect,
style, // Style de la fen^tre.
FALSE, // TRUE ou FALSE, si elle a un menu ou pas.
style_ex // Style ,tendu de la fen^tre.
) == (BOOL)0
)
{
return(-200);
}
/*
* Cr,ation de la fen^tre.
*/
printf("Cr,ation.\n");
if
(
(
fenetre.handle
=
CreateWindowEx
(
style_ex, // Style ,tendu.
"classe_1", // Classe de la fen^tre.
"fenetre_1", // Nom de la fen^tre.
style, // Style.
fenetre.rect.left,
fenetre.rect.top,
fenetre.rect.right - fenetre.rect.left,
fenetre.rect.bottom - fenetre.rect.top,
NULL, // Handle de la fen^tre parente.
NULL, // Handle du menu (s'il y en a un).
hInstance, // Handle du programme.
NULL // Quelque chose de compliqu,.
)
)
==
NULL
)
{
return(-300);
}
/*
* Recherche du contexte d'affichage priv, de la fen^tre.
*/
printf("Device context.\n");
if((fenetre.contexte = GetDC(fenetre.handle)) == NULL)
{
DestroyWindow(fenetre.handle);
return(-400);
}
/*
* Affiche la fen^tre.
*/
printf("Affichage.\n");
ShowWindow
(
fenetre.handle,
SW_SHOWDEFAULT // Type d'affichage.
);
/*
* Initialise la fen^tre.
*/
printf("Update.\n");
UpdateWindow(fenetre.handle);
/*
* Attente.
*/
while(GetMessage(&Msg, fenetre.handle, 0, 0) == 1)
{
printf("Destination : %lu, Message : %lu.\n", (unsigned long)(Msg.hwnd), (unsigned long)(Msg.message));
DispatchMessage(&Msg);
}
printf("Fin.\n");
return(0);
}
LRESULT CALLBACK WindowProc
(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
printf("Destination : %lu | Message : %lu\n", (unsigned long)hwnd, (unsigned long)uMsg);
switch(uMsg)
{
case WM_CLOSE:
if(DestroyWindow(fenetre.handle) == 0)
{
return(-100);
}
return(0);
case WM_DESTROY:
PostQuitMessage(0);
return(0);
}
return(DefWindowProc(hwnd, uMsg, wParam, lParam));
}
Quand on appelle PostQuitMessage() ->WM_DESTROY,
on doit recevoir un message WM_QUIT.
Moi il me libère la "thread message queue" et puis c'est tout.
Comment pourrait-on faire pour le recevoir ?