Dans un environnement Windows XP, en programmant soit avec C#, C++, ou Visual Basic( 6 ou .Net), peut-on afficher le menu (ou un sous menu) d’une fenêtre (pas un PopupMenu : menu flottant) sans utiliser ni la souris, ni le clavier:
En fait je voudrai créer un menu intelligent comme celui de microsoft excel :
dans ce menu on voit qu’il y’a des éléments cachés, et on peut les afficher en cliquant sur l’élément du menu où il y’a les 2 flèches vers le bas, et donc j’ai pensé pouvoir en créer un avec la technique suivante :
-je modifie le menu d’une feuille en cachant quelques éléments du menu.
-je crée un élément du menu qui contient les 2 flèches vers le bas.
-quand je clique sur cet élément, le menu se ferme et je rouvre en même temps le menu en affichant cette fois ci les éléments cachés.
Au moment ou je dois rouvrir le menu je ne dois utiliser ni la souris ni la clavier car j’ai essayé ces 2 solutions et ça ne donne rien quand il faut afficher un sous menu de 3éme niveau par exemple.
pour le PopupMenu (menu flottant) je sais qu’il y’a l’API “TrackPopupMenuEx” qui l’affiche sans la souris, mais je veux savoir si on sait faire la même chose pour un menu normal ( et un sous menu) .
Je pense pas que fermer et re-ouvrir soit la solution, tu veux modifier le menu en cours, je vois pas l’interet de le fermer, tu vas avoir plein d’emmerde avec le focus et les owner windows. Normalement tu peux tout faire en envoyant les messages appropries a ton hwnd pour le menu.
J’ai modifié le menu pour pouvoir cacher les éléments que je veux,mais le problème qui de pose est le suivant :
quand je clique sur un élément du menu, ceci ferme automatiquement le menu qui est ouvert et je peux récupérer l’événement du click grâce au message WM_COMMAND, donc je ne peux garder le menu ouvert une fois que je clique sur un de ses éléments.
alors est-il possible de garder le menu ouvert après avoir cliqué sur un de ses éléments? et si oui, peut-on modifié la taille du menu en le gardant ouvert car si je dois afficher les éléments cachés du menu je dois modifié sa hauteur.
pour pouvoir changer le menu j’utilise le sous classement avec l’API = SetWindowLong et les messages : WM_INITMENU, WM_INITMENUPOPUP, WM_MEASUREITEM, WM_DRAWITEM.
Houlà ! si j’ai bien compris, tu veux faire un menu style Office XP où les options les peu utilisées sont cachées. Tu es en train de partir dans un projet assez faramineux où il va te falloir gérer tout ce qui touche au dessin/retaillage/état des différents éléments. Tu perds ton temps alors qu’il existe déjà de tels composants qui gère efficacement ce type de menu et dont les code sources sont libre de droits. Cherche bien sur les sites de programmation. mot-clé : « CExtMenuControlBar »
[quote=« majid, post:3, topic: 26313 »]J’ai modifié le menu pour pouvoir cacher les éléments que je veux,mais le problème qui de pose est le suivant :
quand je clique sur un élément du menu, ceci ferme automatiquement le menu qui est ouvert et je peux récupérer l’événement du click grâce au message WM_COMMAND, donc je ne peux garder le menu ouvert une fois que je clique sur un de ses éléments.
alors est-il possible de garder le menu ouvert après avoir cliqué sur un de ses éléments? et si oui, peut-on modifié la taille du menu en le gardant ouvert car si je dois afficher les éléments cachés du menu je dois modifié sa hauteur.
pour pouvoir changer le menu j’utilise le sous classement avec l’API = SetWindowLong et les messages : WM_INITMENU, WM_INITMENUPOPUP, WM_MEASUREITEM, WM_DRAWITEM.[/quote]
Hola non y a plus simple que ca pour le faire… je vais essayer de te coder un petit truc qui fait un truc approchant … si j’ai le temps
C’est juste un truc que j’ai fait en 10 minutes, pas sur du tout que ca soit le meilleur moyen de faire, ou que ca soit pas le seul ou le plus adapte ou quoi, j’ai juste fait UN truc possible qui marche vaguement comme tu veux, tu peux creuser apres, c’est clairement pas du code a utiliser dans un soft en production, juste une petite demo d’une possibilite
Bon alors le premier truc a faire c’est de rajouter des menuitems dans le menu quand on clique sur le bon bouton dans le menu, pour ca c’est tout con j’utilise le menu merging en mergeant un menu dans l’autre:
Et voila, a priori ca devrait marcher a tous les niveaux de menu, meme si j’ai pas essaye… a toi de voir si tu peux travailler a partir d’une solution comme ca en faisant une archi propre par dessus pour l’integrer a ton app… Mais la c’est ton taff
PS: Ha ouai faut aussi faire le menage proprement et « debrancher » l’event si on veut vraiment faire ca bien…
Merci Glop pour ton coup de main (vachement sympa de ta part d’avoir pris le temps de réaliser le programme).
et merci pour Tomma pour “CExtMenuControlBar”