Menu intelligent

Bonjour tout le monde,

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) .

Merci.

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 » :stuck_out_tongue:

[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 :stuck_out_tongue:

Bon alors DISCLAIMER :stuck_out_tongue:

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 :stuck_out_tongue:

Maintenant le code…

http://www.winfxcoder.com/demos/HideItem.zip

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:

private void showStuffToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripManager.Merge(this.menuStrip2, this.menuStrip1); }

Rien de complexe.

Apres il faut juste que j’empeche la drop down de se fermer quand on clicke sur un certain type de menuitem, pour ca je fais ca:

[code] public class MyExtenderMenuItem : ToolStripMenuItem
{
private ToolStripItem lastClickedItem = null;
protected override ToolStripDropDown CreateDefaultDropDown()
{
ToolStripDropDown dropDown = base.CreateDefaultDropDown();
if (dropDown != null)
{
dropDown.Closing += new ToolStripDropDownClosingEventHandler(menu_Closing);
}
return dropDown;
}

	protected override void OnDropDownItemClicked(ToolStripItemClickedEventArgs e)
	{
		lastClickedItem = e.ClickedItem;
		base.OnDropDownItemClicked(e);
	}

	void menu_Closing(object sender, ToolStripDropDownClosingEventArgs e)
	{
		if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked &&
			lastClickedItem is ExpandMenuItem)
		{
			e.Cancel = true;
		}
		else
		{
			if (this.Owner != null)
			{
				ToolStripManager.RevertMerge(this.Owner);
			}
		}
	}
}[/code]

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 :stuck_out_tongue:
PS: Ha ouai faut aussi faire le menage proprement et « debrancher » l’event si on veut vraiment faire ca bien…

j’y pipe que dalle en code, je sais pas ce que je fous sur ce topic mais je trouve Glop vachement sympa pour le coup !

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”

Bah ca m’a pris 10 minutes sur un sujet que je connais :stuck_out_tongue: c’est pas la mort.

Ca c’est le genre de truc qui sape le moral… Me faudrait des heures moi… M’enfin c’est clair que je ne connais pas du tout le sujet… :stuck_out_tongue:

GloP est toujours sympa, quand il poste sur un thread de SegFault, il lachera toujours un bout de code.

C’est pas un truc que je ferai, par pure flemme ( ou egoïsme, allez savoir … ) ça force encore plus le respect !

Bon sinon moi j’ai un projet, mais je sais pas trop comment faire , je voudrais créer un OS, tu saurais me faire ça Glop ? :stuck_out_tongue:

Mange du poulet (je suis sûrement le premier à faire un tel jeu de mot avec « OS »)

Ouais, tout comme titibgosse, qu’est-ce que je fais là moi? :stuck_out_tongue: