begin process at 2012 05 30 12:30:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

GUI

 > 

WM_QUIT


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

WM_QUIT

dimanche 16 juillet 2006 à 14:36:54 | WM_QUIT

_michel

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 ?

 

dimanche 16 juillet 2006 à 18:38:18 | Re : WM_QUIT

aardman

Membre Club
Salut,
C'est normal, quand tu recois le WM_QUIT, GetMessage() retourne FALSE et  donc tu sors de la boucle de messages.
lundi 17 juillet 2006 à 12:36:47 | Re : WM_QUIT

_michel

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 :

"  /*
   * Attente.
   */
  while(1)
  {
    resultat = GetMessage(&Msg, fenetre.handle, 0, 0);
    printf("Destination : %lu, Message : %lu.\n", (unsigned long)(Msg.hwnd), (unsigned long)(Msg.message));
    switch(resultat)
    {
      case 0:
        printf("Fin normale.\n");
        return(0);

      case -1:
        printf("Fin anormale : \"thread message queue supprim,e\".\n");
        return(0);

      default:
        DispatchMessage(&Msg);
    }
  }"

On affiche toutjours à l'écran "Fin anormale ..."

Au début, je mettait "while(GetMessage(...))"
mais la boucle était infinie (GetMessage renvoyait toujours -1) et le programme ne terminait jamais.

lundi 17 juillet 2006 à 13:13:02 | Re : WM_QUIT

aardman

Membre Club
Réponse acceptée !
Salut,
Normalement il faut mettre NULL au deuxieme param de GetMessage() vu que c'est ta boucle de message principale.
A mon avis quand tu détruis ta fenetre, fenetre.handle devient invalide et c'est pour ca que GetMessage() retourne -1.
mardi 18 juillet 2006 à 14:12:19 | Re : WM_QUIT

_michel



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.



Cette discussion est classée dans : style, fenetre, classe, fen, tre


Répondre à ce message

Sujets en rapport avec ce message

style de fenetre en MDI [ par glipper ] Bonjour,je suis en train de creer un projet en MDI (multiple document interface), et je voudrais mettre le style WS_EX_TOOLWINDOW à une fenetre fille. Style d'un fenetre Win32 [ par JCDjcd ] Je voufrait bien savoir quel style il faut mettre pour que ma fenetre ne soit pas redimmensionnable !!!<img src=/imgs2/smile_sh Synchronisation!!! [ par PunkDude424 ] J'ai un problème avec la synchronisation de ThreadVoilà, je fais un "ScreenSaver" qui affiche des point a des temps radom et dune durée random aussi.. Faire un control style ComboBox [ par Pinky84 ] Je desire faire un control dans le style d'un combobox. Mon probleme c'est que la fenetre qui est creer quand on ouvre la liste deroulante et qu'on cl Modifier le style d'une fenetre pendant execution [ par sephiro ] Bonjour j'ai créé une fenetre avec HWND hwnd = CreateWindowEx(WS_EX_TOPMOST, _T("SON NOM"), 0, WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBL Style GTK [ par Snakes974 ] Bonjour tout le mondeJe commence a apprendre à creer des interface avec GTK mais quand j'ouvre une fenetre, elle a le meme style qu'une fenetre window Timer C++ & Methode non static [ par watoubilly ] bonjour,je souhaiterais réaliser un timer dans une classe C++ qui appel une methode de cette meme class.Mon pb est que cette classe ne dispose pas des Dev-Cpp et Windows XP Style [ par lektrosonic ] Quand je selectionne aux Projects Options: Suporte Windows XP Style..et je lance mon application, la fenetre est trop laide. Atutour des edit et des s Sous classer plusieurs controles dans une classe [ par julien_boss ] Bonjour,je vous détail l'ossature de ma classe, qui crée une fenetre :jappelle une methode Create() qui va ... créer la fenetre, je fais passer dans l CACHER LA FENÊTRE DOS [ par yun93330 ] Bonjour, voila je commence a programme, mais je suis face a un problème, il y a une source sur le site mais cela ne m'a pas aide, en faite quand je la


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales