0

我有一个 wxMenuBar 和一个 wxMenu。我可以使用 Append(...) 成功地将菜单附加到菜单栏。我还可以使用 Remove(...) 成功删除菜单。

“menu”示例演示了添加和删除菜单:它创建一个菜单,Append-s,然后 Remove-s,在返回的指针上调用 delete。要添加另一个,它会创建一个全新的菜单。因此没有任何重新连接。

但是,我希望能够附加、删除和重新附加任何特定菜单(或允许这样做的等效菜单)。此外,它必须没有内存泄漏。


我努力了:

//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);

这会产生一个没有内存泄漏的工作程序。奇怪的是,我发现 menubar->Remove 返回的指针与最初 Append-ed 的指针不同。

我试过了:

//startup
menubar->Append(menu,title);
//later
delete menubar->Remove(1);
menubar->Append(menu,title); //add it back immediately after removing it.

这会在 appbase.cpp:1015 中产生一个断言错误,这与两次附加菜单有关。

我真的不知道自己在做什么,如果有人能解释这样做的“正确”方法,我将不胜感激。

4

2 回答 2

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

这是处理右键单击某些内容时显示的弹出上下文菜单的标准方法,但它不是在窗口中弹出菜单,而是附加到菜单栏。

于 2012-09-13T12:14:57.887 回答
1

我不明白返回的菜单Remove()与您附加的菜单有何不同。也许您的菜单不在位置 1?

无论如何,规则很简单:菜单栏拥有附加(或插入)它的菜单的所有权,这意味着它将删除它们。当您从菜单栏中删除菜单时,它会放弃所有权,现在您有责任将其删除。

因此,您可以删除菜单并稍后重新添加。但是您不能两次添加相同的菜单。

于 2012-09-13T09:48:47.477 回答