【问题标题】:Reattaching/Removing wxMenu on a wxMenuBar + Memory Concerns重新附加/删除 wxMenuBar 上的 wxMenu + 内存问题
【发布时间】:2012-09-13 03:22:45
【问题描述】:

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

“菜单”示例演示了添加和删除菜单:它创建一个菜单,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 中产生一个断言错误,即附加菜单两次。

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

【问题讨论】:

    标签: wxwidgets


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在删除位置,而不是索引(索引 = 位置 - 1)。将我的代码更改为在索引而不是位置处删除可以解决问题。即,Remove(1) 不起作用,但 Remove(0) 起作用,如果有一个菜单。你能确认这是正确的吗?
    • 索引和位置是同义词,都是从0开始的。
    【解决方案2】:

    只要您不删除菜单并将其保存在某个地方,就可以了。

    类似这样的:

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

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

    【讨论】:

    • 我应该提到-我尝试了这种方法,但失败了。 Remove 显然需要是一个索引?
    猜你喜欢
    • 2014-06-21
    • 2019-07-03
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多