オーナードローポップアップメニューの文字表示について – プログラミング – Home

オーナードローポップアップメニューの文...
 
通知
すべてクリア

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


三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
Topic starter  

三草と申します。
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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> 1.なぜ同じ文字列になるのでしょうか?

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

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

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

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

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


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
Topic starter  

三草です。

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました