yerosnimus
Messages postés18Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention15 janvier 2007
-
5 nov. 2004 à 09:41
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
5 nov. 2004 à 19:20
Bonjour,
J'ai quelques problèmes pour comprendre le fonctionnement des menus, je recherche donc des sources en C++ (si possible développée avec Dev-C++) utilisant :
- un fichier rsrc.rc pour créer les menus
- une application ayant au moins un début d'aide en ligne (puisque c'et ça qui me bloque).
Et si possible une petite application, ça serait le bonheur :-)
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 5 nov. 2004 à 11:41
Salut,
Pour mieux comprendre le fonctionnement des menus, je pense qu'il est préférable d'utiliser les API directement sans passer par les fichiers ressources. Voici des fonctions pour les menus:
CreateMenu()
CreatePopupMenu()
AppendMenu()
InsertMenuItem()
SetMenu()
DestroyMenu()
Etc..
Ce ne sont que des exemples de fonctions API. Leur utilisation n'est pas compliquée et présente aussi l'avantage d'être compatible avec tous les compilateurs sous Windows. Cela permet également de changer les menus pendant l'exécution du programme. Voici la liste complète des fonction:
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 5 nov. 2004 à 12:57
Pour cela, il y'a plusieurs solutions. Ca dépend de la nature de cette deuxième fenêtre. Tu peux créer cette deuxième fenêtre exactement de la même façon que la première. Après avoir défini tous les membres de la classe de cette fenêtre, tu appelles la fonction CreateWindowEx() avec le style WS_CHILD. Cet appel peut se faire suite au clic sur AIDE. Il peut aussi se faire pendant le lancement de la première fenêtre dans le traitement du message WM_CREATE. Dans ce cas la deuxième fenêtre ne doit pas avoir le style WS_VISIBLE. Elle restera invisible tant qu'on n'a pas fait ShowWindow(hwnd2, SW_SHOW). Cette fonction sera donc appelée suite au clic sur AIDE. Pour la cacher de nouveau on fait ShowWindow(hwnd2,SW_HIDE). A toi de voir ce qui te convient.
yerosnimus
Messages postés18Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention15 janvier 2007 5 nov. 2004 à 14:53
C'est la première solution que j'ai choisie mais quand je clique sur "AIDE" rien ne se passe. Je pense que j'utilise mal cette fonction CreateWindowsEx().
Voici ce que j'ai fait (en résumé) :
#include <windows.h>
using namespace std;
/* Declare Windows procedure */
LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);
/* Make the class name into a global variable */
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
/* The Window structure */
...
}
/* This function is called by the Windows function DispatchMessage( ) */
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_COMMAND:
{
case 104:
{
HINSTANCE hInstance;
HWND hwnd2; /* This is the handle for our window */
WNDCLASSEX wincl2; /* Data structure for the windowclass */
/* The Window structure */
wincl2.hInstance = hInstance;
wincl2.lpszClassName = szClassName;
wincl2.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl2.style = CS_DBLCLKS; /* Catch double-clicks */
wincl2.cbSize = sizeof(WNDCLASSEX);
/* Register the window class, if fail quit the program */
if(!RegisterClassEx(&wincl2)) return 0;
/* The class is registered, let's create the program*/
hwnd2 = CreateWindowEx(
WS_EX_CLIENTEDGE, /* Extended possibilites for variation */
szClassName, /* Classname */
"Présentation", /* Title Text */
WS_CHILD,
CW_USEDEFAULT, /* Windows decides the position */
CW_USEDEFAULT, /* where the window ends up on the screen */
544, /* The programs width */
375, /* and height in pixels */
HWND_DESKTOP,
NULL, /* No menu */
hInstance, /* Program Instance handler */
NULL /* No Window Creation data */
);
ShowWindow(hwnd2, SW_SHOW);
WinHelp (hwnd2,"D:\\Data\\C++\\MesProjets\\Projet1\\HLP32\\GENXMLAIDE.HLP>Présentation",HELP_CONTENTS,0);
break;
}
} // fin du switch pour la gestion du menu
} // fin du WM_COMMAND
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 5 nov. 2004 à 19:20
Si tu veux utiliser la fonction WinHelp() tu n'as pas besoin de créer une deuxième fenêtre car cette fonction la crée automatiquement. Si tu veux que ta 2ème fenêtre ressemble à celle de WinHelp alors là il faut faire attention à plusieurs choses.
- Si les 2 fenêtres sont de la même classe, RegisterClassEx() ne doit être appelée qu'une seule fois.
- La 2ème fenêtre ne doit pas être créée avec le style WS_CHILD afin qu'elle soit indépendante.
- La 2ème fenêtre doit avoir sa propre procédure de gestion des messages.
- Etc...
Si tu as un fichier HLP, je pense qu'il est préférable d'utiliser la fonction WinHelp(). Pour cela il te suffira d'appeler cette fonction à la suite du clic sur AIDE. C'est beaucoup plus facile et pratique.