Membres inscrits :2359
Membres en ligne : 0
Invités en ligne : 4


|
Conversation : wxMenuItem - comment récupérer les données du parent? |
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne |
Bonjour à tous,
Je reviens vers vous parce que, après avoir fait des recherches et lu la documentation dans tous les sens, je n'arrive pas à trouver une solution à mon problème.
Voila, j'ai un wxMenu, comportant des sous menus, qui eux même peuvent comporter des sous menus, etc. A ce menu, j'ai :
Code wxWidgets:menu->Connect(wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)&MyFrame::OnMenuSelect, NULL, this); Ceci fonctionne bien, j'arrive à récupérer dans OnMenuSelect l'element cliqué :
Code wxWidgets: wxMenuItem* current_item = current_menu->FindItem(evt.GetId()); Jusqu'ici, donc pas de problèmes. Maintenant ce que je voudrais, ce serait la récupération du menu parent, ou plus précisément, la récupération du wxMenuItem parent. Je suppose que ça doit être assez facile, et que ça doit être lié à une histoire de pointeur, mais j'avoue ne pas avoir vraiment trouvé de solution.
Je tiens à préciser que le menu est généré dynamiquement et que les ID utilisés resultent de :
Code wxWidgets:wxWindowID tempID = wxNewId();
J'espère que quelqu'un pourra m'éclairer sur ce problème.
@+
Jon
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
Salut.
En fait, si le wxMenuItem courant possède un parent, ça sera forcément un wxMenu, que tu pourras récupérer avec wxMenuItem::GetMenu().
Tu veux en faire quoi exactement ?
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne |
Merci pour ton retour. 
En fait pour faire simple, j'ai un wxMenu comme suit:
+ item 1 | + item 2+ | | | + item 3 | + item 3 | + item 4
Lorsque je clic sur item 3, je peux récupérer la valeur de ce menu grâce à son ID (FindItem(evt.GetId())). Mais ce que je voudrais, c'est pouvoir récupérer item 2. La solution serait peut être de faire une fonction qui parcourt tous les éléments du menu en vérifiant les éléments enfants... etc. Mais peut être qu'il y a une solution plus simple.
Merci d'avance pour les réponses.
Jon
|
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Site web
Hors ligne |
C'est bien ce que je dis : item2 est en fait un wxMenu, pas un wxMenuItem. Tu peux donc le récupérer avec item3->GetMenu()
Si tu as vraiment besoin d'un wxMenuItem, tu peux essayer de faire un cast, mais c'est pas sûr que ça ne plante pas.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà ... et effectivement, depuis le temps, ce n'est plus tellement nouveau....
|
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne |
Merci.
Il semblerait effectivement que ce soit la solution. Néanmoins, je n'arrive pas à récupérer le titre avec getTitle().
Code wxWidgets: wxMenu* menu_tested = current_item->GetMenu(); wxString valeur_de_test = menu_tested->GetTitle(); valeur_de_test est vide.
Voici un bout de mon code de test qui génère le menu (peut être qu'il y a un souci déjà ici).
Code wxWidgets: wxMenu *menu = new wxMenu; wxString stringnumber; for(unsigned int i = 1; i < 7; ++i) { wxMenu* submenu = new wxMenu; //Je récupère un menu qui sera utilisé en tant que sous menu ci-dessous wxMenu *submenu_fontsize = new wxMenu; submenu_fontsize = getFontSizeEntries(); wxMenuItem *mymenu = new wxMenuItem(submenu, ID_FONT_SIZE, wxT("Font Size"), wxT("Font Size"), wxITEM_NORMAL, submenu_fontsize); mymenu->SetBitmap(menu_font_size_xpm); mymenu->SetId(ID_FONT_SIZE); submenu->Append(mymenu_2); stringnumber = wxString::Format(wxT("%d"), (int)i); menu->AppendSubMenu(submenu, wxT("item "+stringnumber)); } menu->Connect(wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction)&MyFrame::OnMenuSelect, NULL, this);
voici un bout de mon code pour OnMenuSelect :
Code wxWidgets: void MyFrame::OnMenuSelect(wxCommandEvent &evt) { wxMenuItem* current_item = current_h_menu->FindItem(evt.GetId()); wxMenu* menu_tested = current_item->GetMenu(); // c'est ok de faire current_item->GetItemLabel() // ko si je fais menu_tested->GetTitle() }
L'idéal ce serait que je puisse récupérer le libellé de l'élément cliqué, celui du parent et celui du parent du parent. Est ce que c'est faisable? De mon coté je cherche une solution. Si je trouve quelque chose d'optimal, je posterai ma solution...
@+
Jon
|
|
starmate (Membre)
Inscrit le : 28-06-2011
Messages: 23
Snippets: 1
Tutoriels: 0
Hors ligne |
Bonjour à tous,
Je reviens vers vous pour poster la solution que j'ai trouvé à mon problème. Le bout de code ci-dessous permet d'obtenir l'arbre complet de l’élément sur lequel on clic dans un menu. Il faut que tous les éléments du menu comportent des id uniques. Il s'agit d'une fonction récursive.
Code wxWidgets: // menu_to_check : menu dans lequel se trouve l’élément recherché // value_to_check : la valeur recherché // id_to_check : l'id de l'élément recherché wxString MyFrame::BrowseMenu(wxMenu *menu_to_check, wxString value_to_check, int id_to_check) { wxString return_value; wxMenuItemList menu_list = menu_to_check->GetMenuItems(); return_value = ""; wxMenuItem* current_item_found = menu_to_check->FindChildItem(id_to_check); //nous parcourons tous les éléments du menu for(unsigned int i = 0; i < menu_to_check->GetMenuItemCount(); ++i) { wxMenuItem* item_menu = menu_to_check->FindItemByPosition(i); //si l'élément recherché n'est pas trouvé, nous continuons la recherche if(value_to_check != item_menu->GetItemLabel() && current_item_found == NULL) { if(item_menu->GetSubMenu() != NULL){ wxMenu* sub_menu = item_menu->GetSubMenu(); wxMenuItem* item_found = sub_menu->FindItem(id_to_check); //si l'id recherché se trouve dans l'arbre du menu, nous incorporons le nom de l'arbre + nouvelle recherche parmi les fils if (item_found != NULL){ return_value += item_menu->GetItemLabel() + " >> " + BrowseMenu(sub_menu, value_to_check, id_to_check); } } } else if (item_menu->GetId() == id_to_check) { //si la valeur trouvée correspond à notre recherche, alors nous récupérons le label return_value = item_menu->GetItemLabel(); } } return return_value; }
Bon ce code en lui même, n'a pas beaucoup d'utilité, mais peut être modifier et adapté à vos projets si vous avez besoin d'avoir le chemin complet d'un élément présent dans un arbre. Dans le cas ou vous avez besoin d'afficher un fil d’Ariane, ce code est donc utilisable. Il est sûrement possible de le simplifier aussi .
@+
Jon
|
|
|