wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 5
Pub hébergeur
Pourquoi cette pub ?

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxMenuItem - comment récupérer les données du parent?
Conversation : wxMenuItem - comment récupérer les données du parent?
21-07-2011 12:25:45  wxMenuItem - comment récupérer les données du parent? #1
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
21-07-2011 12:47:23  Re: wxMenuItem - comment récupérer les données du parent? #2
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1365
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à...
21-07-2011 13:29:29  Re: wxMenuItem - comment récupérer les données du parent? #3
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
21-07-2011 13:35:34  Re: wxMenuItem - comment récupérer les données du parent? #4
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1365
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à...
21-07-2011 15:02:47  Re: wxMenuItem - comment récupérer les données du parent? #5
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
22-07-2011 11:00:39  Re: wxMenuItem - comment récupérer les données du parent? #6
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
Menu forum (navigation):
Pages: 1  
 
Accueil » Accueil forums » Développement C/C++
» wxMenuItem - comment récupérer les données du parent?