_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010
-
16 juil. 2006 à 14:36
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010
-
18 juil. 2006 à 14:12
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;
/*
* 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);
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 ?
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 17 juil. 2006 à 12:36
Salut,
en fait, ce qui se passe, c'est que la boucle ne recoit pas de WM_QUIT, mais est quitte quand même car Get Message renvoit -1 (thread queue inexistante).
Si on renplace la boucle par :
_michel
Messages postés77Date d'inscriptionmardi 27 juin 2006StatutMembreDernière intervention12 août 2010 18 juil. 2006 à 14:12
C'est ça, il faut mettre NULL, car le message WM_QUIT à pour handle 0. Comme je ne prenais que les messages ayant pour handle l'handle de ma fenêtre, il ne trouvais jamais le message.