Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

6 réponses
Avatar
JPLafarge
Bonjour,

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

Cordialement,
Jean-Pierre Lafarge

6 réponses

Avatar
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()
Avatar
JPLafarge
On 17 nov, 23:29, Christian ASTOR wrote:
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
Avatar
JPLafarge
On 17 nov, 23:29, Christian ASTOR wrote:
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
Avatar
Christian ASTOR
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);
}
Avatar
JPLafarge
On 7 déc, 00:14, Christian ASTOR wrote:
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
Avatar
Christian ASTOR
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);
}