私自身の喜びのために、Windows API メニューをより簡単に使用するための良い方法を考えようとしています。私はこれを見つけましたが、実際にはクラスごとにメニュー項目のタイプを区別するかもしれませんが、私は次のようなものを目指しています:
説明
class MenuItem {...};
class MenuBar { //for the main menu of a window (file, help, etc)
std::list<MenuItem> items; //and whatever else
};
class PopupMenu { //for dropdown (and possibly context) menus
std::list<MenuItem> items; //and whatever else
};
このMenuItem
クラスにはcheck()
、disable()
、 、 などの関数と、 (string、bitmap、separator) および(enabled、checked、defaulted)setText()
などのより一般的な関数があります。setType()
setState
クラス自体は、私のMenu
ビジョンではappendStringItem()
、appendItem
、insertBitmapItem()
、 などの機能を提供し、アイテム自体へのアクセスを提供します。Menu
また、基本クラスを使用するかどうかについても議論していました。入力は歓迎されますが、それは質問のトピックではありません。
使用方法を募集
これが単なる C++ であれば、問題はありません。ただし、クラスを変更しても実際のメニュー項目が自動的に変更されないため、メニュー項目を Windows が使用するメニュー項目と同期する際に問題が発生します。メニュー項目を変更するには、メニューと、そのメニュー内の位置または項目の ID を指定する必要があります。これは理にかなっていますが、使用の観点からすると、これを行うことができないのはなぜですか。
MenuBar menuBar; //pretend this is filled
menuBar.itemAt(2).setText("New text");
問題
問題は、これにより実際のメニューのメニュー項目が変更されることを期待することですが、実際には変更されません。各アイテムには内部に ID が保存されているため、アイテムを所有するメニューを知る方法が必要です。
の適切な挿入関数内でこれを行うことができますMenuBar
:
bool MenuBar::someInsertionFunction(unsigned index, MenuItem newItem) {
newItem.setOwner(*this); //owner as a raw HMENU type, with *this converting
items.emplace_back(index, newItem); //index checked, of course
}
それが完了したら、各セッターをMenuItem
チェックして所有者が有効であることを確認し、有効である場合は API 関数を使用してアイテムを更新する必要があります。同様に、ゲッターでは、API 関数を呼び出して現在の状態を取得しますが、所有者が有効な場合に限ります。これにより、ユーザーは独自の のリストを作成し、それを介してMenuItem
a を初期化できます。このメソッドは、クラスが自身を適切に保護Menu
するため、ユーザーが何の影響もなく内部アイテム リストを変更するためのフル アクセスを許可します。MenuItem
しかし、これは私が良いと思っている概念に反しています。この問題に対処するデザインパターンはありますか、それとも、メニュー項目によって制御されるのではなく、それ自体を制御できるようにするために、この「ルール」を破るのが私の最善の策です。メニュー?