begin process at 2008 09 06 03:09:34
1 237 631 membres
31 nouveaux aujourd'hui
14 313 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : probleme de menu [ Archives / API ] (Stubbornman)

probleme de menu le 05/05/2005 23:36:49

Stubbornman

Bonsoir a tous,

J'ai un soucis avec des menus. Je souhaite creer des fenetres filles qui ont chacune un menu. Or je n'arrive pas a afficher les menus dans ces fenetres filles...
Savez-vous pourquoi???

Voici mon code (je suis debutant... desole pour le manque de clarete) :

//
// Fichier d'implementation de l'interface

#include <windows.h>
#include "../resources/resource.h"
#include "../include/about.h"

#define IDB_NEW_RECIPE 200

// Prototypes
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ProcRecipe(HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK ProcFood(HWND, UINT, WPARAM, LPARAM) ;

// Handles
HINSTANCE hInst;
HWND  hWnd, hWndRecipe, hWndFood;  // handle sur la fenetre
HMENU  hMenu, hMenuRecipe, hMenuFood; // handle sur les menu
const  HBRUSH hCouleur_Blanche =  CreateSolidBrush(RGB(255,255,255));// handle sur un pinceau solid de couleur blanche
HBRUSH  hBackground = hCouleur_Blanche;

// Création d'une fonte pour la personnalisation des boutons et du contrôle static.
HFONT hFonte = CreateFont(15,7,0,0,FW_DONTCARE,true,false,false,DEFAULT_CHARSET ,
        OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
        DEFAULT_PITCH | FF_DONTCARE, "Arial");

// Definition des boutons
HWND hWndButtonNewRecipe;

// Definition du nom de la fenetre
static char szClassName[ ] = "Main Window";
static char szRecipe[ ] = "Recipe Window";
static char szFood[ ] = "Food Window";

// Déclaration de la structure pour compléter l'argument 11 dans les fonctions
// de créations des fenêtres enfants
CREATESTRUCT Parent;

// Fonction Winmain()
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR   lpcmdLine,
                    int    nCmdShow)

{
 hInst = hThisInstance;

 WNDCLASSEX wincl;
     wincl.hInstance     = hThisInstance;     // handle de l'instance d'application
  wincl.lpfnWndProc   = WindowProcedure;     // pointeur long sur la fonction que window  appelle pour traiter les messages destiné à l'application
  wincl.hbrBackground = hBackground;      // handle de la couleur du fond de la fenêtre
  wincl.style         = CS_HREDRAW | CS_VREDRAW;   // Spécifies le(s) style(s) de la fenêtre.
  wincl.lpszClassName = szClassName;      // pointeur long désignant le nom de la classe
  wincl.cbSize        = sizeof (WNDCLASSEX);    // spécifie la taille, en bytes, de la structure.
        wincl.hIcon         = LoadIcon (hInst, MAKEINTRESOURCE(IDI_APPICON)); // Utilise l'icone prédéfinie
  wincl.hIconSm       = LoadIcon (hInst, MAKEINTRESOURCE(IDI_APPICON)); // Utilise l'icone prédéfinie
  wincl.hCursor       = LoadCursor (NULL, IDC_ARROW);  // Utilise le curseur standard (flêche)
  wincl.lpszMenuName  = MAKEINTRESOURCE(ID_MENU);   // Pointeur sur la ressource menu
  wincl.cbClsExtra = 0;        // Non utilisé pour l'instant
  wincl.cbWndExtra = 0;        // Non utilisé pour l'instant

 if (RegisterClassEx (&wincl) == false)
  return NULL;

 wincl.lpfnWndProc = ProcRecipe;
 wincl.lpszClassName = szRecipe;
 wincl.lpszMenuName  = MAKEINTRESOURCE(ID_NEW_RECIPE_MENU);

 // Enregistrement de la classe de fenêtre Recipe :
 if (RegisterClassEx(&wincl) == false)
  return NULL;

 wincl.lpfnWndProc = ProcFood;
 wincl.lpszClassName = szFood;
 wincl.lpszMenuName  = MAKEINTRESOURCE(ID_NEW_FOOD_MENU);

 // Enregistrement de la classe de fenêtre Food :
 if (RegisterClassEx(&wincl) == false)
  return NULL;


 hWnd = CreateWindowEx ( 0,     // Spécifie une extension du style de la fenêtre
       szClassName,  // Nom de la classe de fenêtre
       "Recipe Manager", // Titre apparaissant dans la barre de caption (légende)
       WS_OVERLAPPEDWINDOW,// Style de fenêtre
       CW_USEDEFAULT,  // spécifie la position initial horizontal de la fenêtre.
       CW_USEDEFAULT,  // spécifie la position initial vertical de la fenêtre.
       CW_USEDEFAULT,      // Largeur de la fenêtre en pixels
       CW_USEDEFAULT,      // Hauteur de la fenêtre en pixels
       HWND_DESKTOP,       // La fenêtre est une fenêtre enfant du bureau
       NULL,               // Pas de menu
       hThisInstance,      //  Handle de l'instance d'application
       &Parent
        );

 ShowWindow (hWnd, SW_MAXIMIZE);
 hMenu = GetMenu(hWnd);
 UpdateWindow (hWnd);

 // Affichage de la fenetre a l'ecran
 MSG messages;

 while (GetMessage (&messages, NULL, 0, 0)) // tant que pas de message WM_QUIT
    {
  TranslateMessage(&messages); // Convertit les messages concernant les frappes clavier.
  DispatchMessage(&messages);  // Envoie les messages à LRESULT CALLBACK WindowProcedure()
    }

 return messages.wParam;
}


// Fonction WindowProcedure
LRESULT CALLBACK WindowProcedure (HWND hwnd,
          UINT messages,
          WPARAM wParam,
          LPARAM lParam)
{
 POINT point;

    switch (messages)                 
    {
  case WM_CREATE :
  {
   hWndRecipe = CreateWindowEx ( NULL,
          szRecipe,
          "Creation of a new recipe slip",
          WS_CHILD | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
          200,0,600,200,
          hwnd,
          (HMENU) 300,
          hInst,
          NULL);

   hWndFood = CreateWindowEx ( NULL,
          szFood,
          "Creation of a new food slip",
          WS_CHILD | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
          200,0,600,200,
          hwnd,
          (HMENU) 301,
          hInst ,
          NULL);

   hWndButtonNewRecipe =  CreateWindowEx(NULL,
          "BUTTON",
          "New Recipe",
          WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
          10,  80, 150,  30,
          hwnd,
          (HMENU) IDB_NEW_RECIPE ,
          hInst,
          NULL );

  } // Fin traitement WM-CREATE / proc parent ---------------------------

  case WM_RBUTTONUP : // click sur le bouton droit affiche le menu -------
  {
   point.x = LOWORD(lParam); // On récupère les coordonnées
            point.y = HIWORD(lParam); // de la position de la souris
                                      // au moment du click droit. 
   ClientToScreen (hWnd,&point); // Conversion en coordonnees ecran

            TrackPopupMenu(GetSubMenu(hMenu,0),TPM_RIGHTALIGN | TPM_LEFTBUTTON,
                                         point.x,point.y,0,hWnd,NULL);
   break;
  } // fin case WM_RBUTTONUP ------------------------------------------

  case WM_MENUSELECT : // select from menu
        {
         switch (LOWORD(wParam)) // On récupère l'ID de l'option en surbrillance-
            {
    case IDM_NEW_RECIPE : // New Recipe
    {
     SetWindowText(hWnd,"Recipe Manager: Création d'une fiche recette");
     InvalidateRect(hWnd,NULL,true);
     break;
    }

    case IDM_NEW_FOOD : // New Food
    {
     SetWindowText(hWnd,"Recipe Manager: Création d'une fiche aliment");
     InvalidateRect(hWnd,NULL,true);
     break;
    }

    case IDM_SAVE : // Save
    case IDM_SAVE_AS :
    {
     SetWindowText(hWnd,"Recipe Manager: Sauvegarde");
     InvalidateRect(hWnd,NULL,true);
     break;
    }

                case IDM_EXIT : // Quitter
                {
     SetWindowText(hWnd,"Recipe Manager: Quitter");
     InvalidateRect(hWnd,NULL,true);
     break;
    } // Fin Quitter

    case IDM_HELP : // Help
    {
     SetWindowText(hWnd,"Recipe Manager: Aide");
     InvalidateRect(hWnd,NULL,true);
     break;
    }

    case IDM_ABOUT : // A Propos
    {
     SetWindowText(hWnd,"Recipe Manager: A Propos");
     InvalidateRect(hWnd,NULL,true);
     break;
    }

    default :
                {
     SetWindowText(hWnd,"Recipe Manager");
              InvalidateRect(hWnd,NULL,TRUE);   
    }
   } // fin switch (LOWORD(wParam))----------------------------------
  break;
  } // fin case WM_MENUSELECT ---------------------------------------------

  case WM_COMMAND :  // click sur les options menu
  {
   // click sur le bouton quitter de la fenêtre parent :
   if (LOWORD(wParam) == IDB_NEW_RECIPE && HIWORD(wParam) == BN_CLICKED)
   {
    // On rend visible la fenêtre hwndRecipe :
    ShowWindow(hWndRecipe,SW_SHOW);
    hMenuRecipe = GetMenu(hWndRecipe);
    UpdateWindow (hWndRecipe);
    // On masque les CheckBox permettant de creer la fenetre hwndRecipe :
    ShowWindow(hWndButtonNewRecipe,SW_HIDE);
    return 0;
   }

   switch (LOWORD(wParam)) // -----------------------------------------------
   {
    case IDM_NEW_RECIPE :
    {
     // On rend visible la fenêtre hwndRecipe :
     ShowWindow(hWndRecipe,SW_SHOW);
     hMenuFood = GetMenu(hWndFood);
     UpdateWindow (hWndFood);
     ShowWindow(hWndButtonNewRecipe,SW_HIDE);
     return 0;
    }

    case IDM_NEW_FOOD :
    {
     // On rend visible la fenêtre hwndFood :
     ShowWindow(hWndFood,SW_SHOW);
     ShowWindow(hWndButtonNewRecipe,SW_HIDE);
     return 0;
    }

    case IDM_SAVE :

    case IDM_HELP :

    case IDM_SAVE_AS : // option menu Save As // ----------------
    {
     MessageBox(hWnd,"Cette fonction n'est pas implémentée",
                                          "Info de service",MB_OK);
                    break;
    } // Fin SAVE AS

                case IDM_EXIT : // option menu Quitter // ----------------
    {
     int quit = false;

     quit =  MessageBox(hWnd,"Vous voulez réellement Quitter",
           szClassName,MB_YESNO|MB_ICONQUESTION);

     if (quit == IDNO) {return 0; break;}
     SendMessage( hWnd, WM_CLOSE, 0, 0L);
     break;
    } // Fin Quitter

    case IDM_ABOUT : // option menu A Propos  -----------------
                {          
     return aboutCreate(hWnd, hInst);
     break;
                } // Fin A PROPOS -----------------------------------
   } // Fin switch (LOWORD (wParam)) ----------------------------------------- 
   
   break;
  } // Fin WM_COMMAND -------------------------------------------------------

  case WM_SYSCOMMAND : // -------------------------------------------------
  {
            switch (LOWORD (wParam)) // ---------------------------------------------
            {
    case SC_CLOSE : // cas d'un click sur la croix de fermeture
                {
     int quit = 0;
                    quit = MessageBox(hWnd,"Voulez-vous réellement Quitter ?",
                                       szClassName,MB_YESNO|MB_ICONQUESTION);                       
     if (quit == IDNO) {return 0; break;}
                    SendMessage( hWnd, WM_CLOSE, 0, 0L);    
                } // fin case SC_CLOSE ----------------------------------------
                 
                default : // on renvoie tous les autres messages système à windows selon la procédure normale.
                {
     return DefWindowProc (hWnd, messages, wParam, lParam);
     break;
    }
   } // Fin switch (LOWORD (wParam)) -----------------------------------------
              
            break; // Fin case WM_SYSCOMMAND ----------------------------------
  }

  case WM_CLOSE: // -------------------------------------------------------
  {
   DestroyMenu(hMenu);
   DestroyWindow(hWnd);
   break;
  } // fin case WM_CLOSE --------------------------------------------------
      
 
  case WM_DESTROY: // -------------------------------------------------------
  {
   PostQuitMessage (0);       // envoie un message WM_QUIT dans la file d'attente
   break;
  } // fin case WM_DESTROY --------------------------------------------------

  default:                      // Tout les autres messages sont renvoyé à windows. avec les paramètres wParam et lParam
   return DefWindowProc (hwnd, messages, wParam, lParam);
    }
    return 0;
}


LRESULT CALLBACK ProcRecipe(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)

    {
  case WM_SYSCOMMAND :

   switch(LOWORD(wParam))

   {
    case SC_CLOSE :
     ShowWindow(hWndRecipe,SW_HIDE);
     // On remet les boutons de la fenêtre parents "actifs"
     EnableWindow(hWndButtonNewRecipe,true);
     return 0;

    default :
     return DefWindowProc(hWnd,message,wParam,lParam);

   }
  return 0;


 }
 return DefWindowProc(hWnd,message,wParam,lParam);

}// Fin de la procédure de traitement des messages de la fenêtre enfant 1 -----


LRESULT CALLBACK ProcFood(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)

    {
  case WM_SYSCOMMAND :

   switch(LOWORD(wParam))

   {
    case SC_CLOSE :
     ShowWindow(hWndFood,SW_HIDE);
     // On remet les boutons de la fenêtre parents "actifs"
     EnableWindow(hWndButtonNewRecipe,true);
     return 0;

    default :
     return DefWindowProc(hWnd,message,wParam,lParam);

   }
  return 0;


 }
 return DefWindowProc(hWnd,message,wParam,lParam);
}

Merci de votre aide.



Classé sous : case, wincl, hwnd, wparam, return

Participer à cet échange

Pub



Appels d'offres

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS