我有一个wxMenuBar和一个wxMenu。我可以使用Append(...)将菜单成功附加到菜单栏。我也可以使用Remove(...)成功删除菜单。
“menu”示例演示添加和删除菜单:它创建一个菜单,Append-s it,然后Remove-s it,在返回的指针上调用delete。要添加另一个,它会创建一个全新的菜单。因此,没有任何重新连接。
但是,我希望能够追加,删除和重新附加任何特定的菜单(或允许它的等效菜单)。此外,它必须没有内存泄漏。
我试过了:
//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);
这产生了一个没有内存泄漏的工作程序。奇怪的是,我发现menubar-> Remove返回的指针与最初追加的指针不同。
我试过了:
//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);
menubar->Append(menu,title); //add it back immediately after removing it.
这会在appbase.cpp中产生一个断言错误:1015,这是关于附加菜单两次的。
我真的不知道我在做什么,如果有人能解释“正确”的方式,我将不胜感激。
答案 0 :(得分:1)
我不明白Remove()
返回的菜单如何与您附加的菜单不同。也许你的菜单不在1号位置?
无论如何,规则很简单:菜单栏取得附加到(或插入)它的菜单的所有权,这意味着它将删除它们。当您从菜单栏中删除菜单时,它会放弃所有权,现在您负责删除它。
因此您可以删除菜单并稍后再将其添加回来。但是你不能两次添加相同的菜单。
答案 1 :(得分:1)
只要您不删除菜单并将其保存在某处,就应该没问题。
这样的事情:
//construct menu
// this needs to be saved somewhere, perhaps as an attribute of the app frame
wxMenu * menu = new wxMenu( title );
....
// Attach menu to menubar
menubar->Append(menu,title);
....
// remove menu ( but don't delete! )
menubar->Remove(1);
....
// re-attach menu
Append(menu,title);
这是处理右键单击某些内容时显示的弹出上下文菜单的标准方法,不同之处在于它不会弹出窗口中的菜单,而是附加到菜单栏。