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.