オーナードローポップアップメニューの文字表示について

[戻る]
三草 2006/03/31(金) 16:24:12
三草と申します。
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.上記以外ではどんな実現方法がありますか?

を教えてください。
よろしくお願いします。

dairygoods 2006/03/31(金) 16:38:40
> 1.なぜ同じ文字列になるのでしょうか?

1つのインスタンスが複数のメニュー項目の描画を担当するからです。


> 別の方法ですが、DrawItem()の引数LPDRAWITEMSTRUCTのitemIDから
> 表示する文字列を判断し、表示する方法も考えましたが、
> ちょっと無理やりかなと思い、上記の方法にしました。

そんなことはありません。普通そうします。
ちゃんと、そのための機能も用意されており、だいたい次のようにします。

MENUITEMINFO info;
info.cbSize = sizeof(info);
info.fMask = MIIM_DATA;
info.dwItemData = ID に関連付けれるデータ
SetMenuItemInfo(メニュー, ID, FALSE, &info);

そうすると、DRAWITEMSTRUCT の itemData に入ってきます。

三草 2006/04/01(土) 00:50:29
[[解決]]
三草です。

> 1つのインスタンスが複数のメニュー項目の描画を担当するからです。

なるほど、納得しました。


> そんなことはありません。普通そうします。
> ちゃんと、そのための機能も用意されており、だいたい次のようにします。
> ・・・
> そうすると、DRAWITEMSTRUCT の itemData に入ってきます。

そういう仕組みがあったのですね。
早速試してみます。

dairygoodsさんありがとうございました。

古いスレッドには追加発言できません。