三草と申します。
VC.netでMFCを使っています。
オーナードローのポップアップメニューを作成し、
背景色や選択時の色を、任意の色に変えようとしています。
色を変えて、メニュー文字列も表示できるのですが、
メニュー文字列が、すべて同じ文字列(最後にセットした文字列)になってしまいます。
手順としては、、、
-----------------------------
1.CMenuを継承したクラスを作成し、DrawItem(),MeasureItem()をオーバライドと、
表示文字列のセッター関数を追加する
2.メインクラスで、セッター関数で表示文字列をセットする
3.メインクラスで、AppendMenu(MF_ENABLED|MF_OWNERDRAW,・・・)でメニューを追加する
4. 2~3を繰り返す
5.CMenu継承クラス内DrawItem()で着色し、セットされた文字列を表示する
-----------------------------
AppendMenuでMF_OWNERDRAWを指定したときに
DrawItem()とMeasureItem()を呼び出していると思っていましたが、違うのでしょうか?
別の方法ですが、DrawItem()の引数LPDRAWITEMSTRUCTのitemIDから
表示する文字列を判断し、表示する方法も考えましたが、
ちょっと無理やりかなと思い、上記の方法にしました。
1.なぜ同じ文字列になるのでしょうか?
2.上記以外ではどんな実現方法がありますか?
を教えてください。
よろしくお願いします。
> 1.なぜ同じ文字列になるのでしょうか?
1つのインスタンスが複数のメニュー項目の描画を担当するからです。
> 別の方法ですが、DrawItem()の引数LPDRAWITEMSTRUCTのitemIDから
> 表示する文字列を判断し、表示する方法も考えましたが、
> ちょっと無理やりかなと思い、上記の方法にしました。
そんなことはありません。普通そうします。
ちゃんと、そのための機能も用意されており、だいたい次のようにします。
MENUITEMINFO info;
info.cbSize = sizeof(info);
info.fMask = MIIM_DATA;
info.dwItemData = ID に関連付けれるデータ
SetMenuItemInfo(メニュー, ID, FALSE, &info);
そうすると、DRAWITEMSTRUCT の itemData に入ってきます。
三草です。
> 1つのインスタンスが複数のメニュー項目の描画を担当するからです。
なるほど、納得しました。
> そんなことはありません。普通そうします。
> ちゃんと、そのための機能も用意されており、だいたい次のようにします。
> ・・・
> そうすると、DRAWITEMSTRUCT の itemData に入ってきます。
そういう仕組みがあったのですね。
早速試してみます。
dairygoodsさんありがとうございました。