0

wxMenuBarとwxMenuがあります。Append(...)を使用して、メニューをメニューバーに正常にアタッチできます。Remove(...)を使用してメニューを正常に削除することもできます。

「menu」サンプルは、メニューの追加と削除を示しています。メニューを作成し、追加してから削除し、返されたポインタで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にアサーションエラーが発生します。これは、メニューを2回アタッチすることに関するものです。

私は自分が何をしているのか本当にわかりません。誰かがこれを行うための「正しい」方法を説明してくれれば幸いです。

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にありませんか?

とにかく、ルールは単純です。メニューバーは、メニューバーに追加された(または挿入された)メニューの所有権を取得します。つまり、メニューバーはメニューを削除します。メニューバーからメニューを削除すると、所有権が放棄され、ユーザーがそのメニューを削除する必要があります。

そのため、メニューを削除して、後で再度追加することができます。ただし、同じメニューを2回追加することはできません。

于 2012-09-13T09:48:47.477 に答える