2017-06-13 1 views
0

J'utilise un wxToolBar qui utilise un menu déroulant avec le code suivant (simplifié):wxToolBar avec menu déroulant: aucune réaction sur le point sélectionné

g_toolBar1->AddTool(TOOLBAR_CMD_CONTROL_DROPDOWN,_("Control elements"),MainWin::getBitmap(gearsXPM,"gears"),wxNullBitmap,wxITEM_DROPDOWN); 
custParent->Connect(TOOLBAR_CMD_CONTROL_DROPDOWN,wxEVT_COMMAND_TOOL_CLICKED,wxCommandEventHandler(DrawCanvasSwitcher::OnToolbar),NULL,g_drawCanvas); 

wxMenu *controlMenu=new wxMenu; 

// following is repeated several times to have more than onw drop-down item 
// (*it) is an iterator to an container holding the required data 
wxMenuItem *item=new wxMenuItem(controlMenu,wxID_ANY,(*it)->m_entityParams.m_name,(*it)->m_entityParams.m_shorthelp); 
controlMenu->Append(item); 
item->SetBitmap(*(*it)->m_entityParams.m_bmToolbar); 
item->SetId((*it)->m_wxID); 
custParent->Connect(item->GetId(),wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED,wxCommandEventHandler(DrawCanvasSwitcher::OnMenu),NULL,g_drawCanvas); 

g_toolBar1->SetDropdownMenu(TOOLBAR_CMD_CONTROL_DROPDOWN,controlMenu); 

g_toolBar1->Realize(); 

La première Connect() est réussie et en cliquant sur l'élément de la barre d'outils supérieure, je finis dans DrawCanvasSwitcher :: OnToolbar(). Le deuxième Connect() qui est simplement copié à partir d'une position différente dans le même fichier et où il fonctionne bien pour les éléments de menu normal - ne fonctionne pas, je n'obtiens jamais un événement dans DrawCanvasSwitcher :: OnMenu() lors de la sélection d'une liste déroulante article. Le type d'événement est le même que celui utilisé dans l'exemple de barre d'outils fourni avec wxWidgets 3.1. g_drawCancas et custParent sont tous valides (et fonctionnent pour les éléments de menu simples).

Alors, quelle pourrait être la raison pour laquelle je ne révise pas les événements sur les éléments déroulants cliqués?

Edit: en utilisant wxEVT_COMMAND_MENU_SELECTED au lieu de wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED ne

Répondre

1

Je ne vois pas fait aucune différence, toujours pas d'événement ... quoi que ce soit évidemment faux dans le code, donc, comme toujours, la meilleure chose à faire serait soit essayer de le simplifier le plus possible et/ou essayer de faire la même chose dans l'exemple de la barre d'outils pour voir si vous pouvez reproduire le problème ici.

Une chose que j'essaierais serait de spécifier (*it)->m_wxID immédiatement lors de la création de l'élément de menu, au lieu de le définir plus tard. Il devrait travailler comme écrit, bien sûr, mais il est plutôt rare de le faire comme ça, alors peut-être qu'il ya un bug quelque part là-bas.

Si vous parvenez à reproduire le problème dans l'exemple de la barre d'outils (par exemple juste supprimer l'entrée pour MyFrame::OnToolDropdown() de table d'événements là-bas et utiliser Connect() à la place), s'il vous plaît faire report it comme un bug, en mentionnant votre plate-forme.

Et enfin, bien qu'il soit tout à fait sans rapport avec votre problème, il n'y a vraiment aucune raison d'utiliser Connect() au lieu de Bind() avec 3.x wxWidgets, vous devriez vraiment passer à ce dernier pour une meilleure sécurité à la compilation et la flexibilité.

+0

la définition de l'ID via SetId() était la raison - lorsque vous le faites lors de la création de l'élément de menu, cela fonctionne bien - merci! Connect() est utilisé car cette application doit aussi être compilée sur certaines plateformes où je suis encore en version 2.8 ... – Elmi