[C++] création d'un menu sans ressources ni MFC

Le
JPLafarge
Bonjour,

Je programme en C++ sous Visual Studio 7 et j'espère que je ne suis
pas hors-sujet ici.
Je souhaiterai créer un menu sur une fenêtre mais en évitant les
ressources (question de portabilité), sans passer par les MFC, et sans
utiliser les menus de types popup, créer un menu "en dur" donc.
Merci beaucoup de m'indiquer comment procéder, si cela est possible
car je suis un peu sceptique.

Cordialement,
Jean-Pierre Lafarge
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #9747391
JPLafarge wrote:

Je programme en C++ sous Visual Studio 7 et j'espère que je ne suis
pas hors-sujet ici.
Je souhaiterai créer un menu sur une fenêtre mais en évitant les
ressources (question de portabilité), sans passer par les MFC, et sans
utiliser les menus de types popup, créer un menu "en dur" donc.
Merci beaucoup de m'indiquer comment procéder, si cela est possible
car je suis un peu sceptique.



CreateMenu()-CreatePopupMenu()-InsertMenu() (ou AppendMenu())-
SetMenu()
JPLafarge
Le #9747381
On 17 nov, 23:29, Christian ASTOR
JPLafarge wrote:
> Je programme en C++ sous Visual Studio 7 et j'espère que je ne suis
> pas hors-sujet ici.
> Je souhaiterai créer un menu sur une fenêtre mais en évitant les
> ressources (question de portabilité), sans passer par les MFC, et sans
> utiliser les menus de types popup, créer un menu "en dur" donc.
> Merci beaucoup de m'indiquer comment procéder, si cela est possible
> car je suis un peu sceptique.

CreateMenu()-CreatePopupMenu()-InsertMenu() (ou AppendMenu())-
SetMenu()



Ok merci, en fait j'ai fait CreateMenu, InsertMenuItem puis SetMenu et
ça marche bien apparement.
Je pensais pas que c'était aussi simple.

Cdt
JP Lafarge
JPLafarge
Le #9747341
On 17 nov, 23:29, Christian ASTOR
JPLafarge wrote:
> Je programme en C++ sous Visual Studio 7 et j'espère que je ne suis
> pas hors-sujet ici.
> Je souhaiterai créer un menu sur une fenêtre mais en évitant les
> ressources (question de portabilité), sans passer par les MFC, et sans
> utiliser lesmenusde types popup, créer un menu "en dur" donc.
> Merci beaucoup de m'indiquer comment procéder, si cela est possible
> car je suis un peu sceptique.

CreateMenu()-CreatePopupMenu()-InsertMenu() (ou AppendMenu())-
SetMenu()



Heu en fait j'ai parlé un peu trop vite. J'ai réussi à obtenir une
barre horizontale avec des items sur lesquels on peut cliquer mais pas
de menus qui se "déroulent" à partir des items de la barre de menu.
principale. J'ai vraiment tout essayé notamment ceci :

HMENU hmenu=CreateMenu();

HMENU hmenupop=CreatePopupMenu(); // ou simple CreateMenu, c'est
pareil
MENUITEMINFO popmenuinfo;
popmenuinfo.cbSize=sizeof(popmenuinfo);
popmenuinfo.fMask=MIIM_STRING;
popmenuinfo.fType=MIIM_STRING;
popmenuinfo.dwTypeData="popup";
popmenuinfo.cch=sizeof("popup");
InsertMenuItem(hmenupop,1,true,&popmenuinfo); // false ou true 0 ou 1
ça ne change rien

MENUITEMINFO menuinfo;
menuinfo.cbSize=sizeof(menuinfo);
menuinfo.fMask=MIIM_SUBMENU;
menuinfo.fType=MFT_MENUBARBREAK; // ou MFT_MENUBREAK, pareil
menuinfo.hSubMenu=hmenupop;

InsertMenuItem(hmenu,1,true,&menuinfo); // ou AppendMenu ça ne change
rien
HWND hwnd=CreateWindow("test","nom fenetre",WS_OVERLAPPEDWINDOW|
WS_VISIBLE,100,300,400,500,NULL,hmenu,hInstance,NULL);
DrawMenuBar(h); // Avec ou sans c'est pareil aussi (y compris
dans la boucle de message)
SetMenu(h,hmenu) // Avec ou sans pareil également.

Aucunes de ces fonctions ne renvoient d'erreurs.
Merci beaucoup parce que ça commence à se corser.

Cordialement
JP Lafarge
Christian ASTOR
Le #9747331
JPLafarge wrote:

InsertMenuItem(hmenu,1,true,&menuinfo); // ou AppendMenu ça ne change




InsertMenu(), comme j'avais dit, notamment pour le popup.

ex :
{
HMENU hWndMenu = CreateMenu();
HMENU hWndPopupMenu = CreatePopupMenu( );
int nIdx = 1000;
char sMenu [255]= "Item1";
InsertMenu(hWndPopupMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING
|MF_ENABLED , nIdx, sMenu );
nIdx = (int) (hWndPopupMenu);
strcpy(sMenu, "Popup");
InsertMenu( hWndMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING| MF_POPUP,
nIdx, sMenu );
SetMenu(hWnd, hWndMenu);
DrawMenuBar(hWnd);
}
JPLafarge
Le #9747321
On 7 déc, 00:14, Christian ASTOR
JPLafarge wrote:
> InsertMenuItem(hmenu,1,true,&menuinfo); // ou AppendMenu ça ne chan ge

InsertMenu(), comme j'avais dit, notamment pour le popup.

ex :
{
HMENU hWndMenu = CreateMenu();
HMENU hWndPopupMenu = CreatePopupMenu( );
int nIdx = 1000;
char sMenu [255]= "Item1";
InsertMenu(hWndPopupMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING
|MF_ENABLED , nIdx, sMenu );
nIdx = (int) (hWndPopupMenu);
strcpy(sMenu, "Popup");
InsertMenu( hWndMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING| MF_POPU P,
nIdx, sMenu );
SetMenu(hWnd, hWndMenu);
DrawMenuBar(hWnd);

}



Oui comme ça ça marche, merci beaucoup.
En fait j'avais délaissé InsertMenu pour InsertMenuItem car la
documentation MSDN indique :

"The InsertMenu function has been superseded by the InsertMenuItem
function. You can still use InsertMenu, however, if you do not need
any of the extended features of InsertMenuItem."

Donc a priori il est possible de faire ce que fait InsertMenu avec
InserMenuItem ? (ou alors j'ai rien compris).

Cordialement,
JP Lafarge
Christian ASTOR
Le #9747311
JPLafarge wrote:

Donc a priori il est possible de faire ce que fait InsertMenu avec
InserMenuItem ? (ou alors j'ai rien compris).



Si, mais ça complique et c'est source d'erreur.
Tu avais par exemple oublié MIIM_STRING.

Par ex, pour le second InsertMenuItem() =>

{
MENUITEMINFO menuinfo = {0};
menuinfo.cbSize = sizeof(MENUITEMINFO);
menuinfo.fMask = MIIM_STRING | MIIM_SUBMENU;
menuinfo.hSubMenu = hmenupop;
menuinfo.dwTypeData = "Popup";
menuinfo.cch = sizeof("Popup");
InsertMenuItem(hmenu, 0xFFFFFFFF, TRUE, &menuinfo);
}
Publicité
Poster une réponse
Anonyme