WM_DRAWITEMでメニューを独自に描画しているのですが、
普通のメニューアイテムはDRAWITEMSTRUCTのitemIDで識別して描画できます。
でもIDのないポップアップ項目はどうやって描画するのでしょうか?
ついでに一番上のメニューもどうやって描画したらいいのかも知りたいです。
一番上とは、タイトルバーの下のファイル・編集といったやつです。
エクセル等のようにしたいので・・・
環境はVC++6.0SP6 WinXPSP2 MFC未使用です。
よろしくお願いします。
>IDのないポップアップ項目はどうやって描画するのでしょうか?
IDのないポップアップ項目 とは具体的にどのようなものなのでしょうか。
>一番上のメニューもどうやって描画したらいいのかも知りたいです。
例えば、ファイルを追加するのであれば、WM_CREATE内で
HMENU hMenu, hFile;
hMenu = CreateMenu(); //親メニューを作成
hFile = CreatePopupMenu(); //ファイル
AppendMenu(hMenu, MF_ENABLED | MF_STRING | MF_POPUP,
(UINT)hFile, ファイル);
SetMenu(hWnd, hMenu);
DrawMenuBar(hWnd);
というような感じでできます。
(AppendMenuを使うよりもInsertMenuItemを使うほうがいいかもしれません)
>エクセル等のようにしたいので
メニューを動かすことができるようにしたいのでしょうか?
それならば、メニューをオーナードローするよりも、
リバーコントロールにメニューを置いたほうがいいかもしれません。
ポップアップの親メニューでも、MEASUREITEMSTRUCT / DRAWITEMSTRUCT の itemID メン
バには何らかの有効な ID が入るようですので、GetMenuItemInfo によってアイテム情
報を取得することは可能です。
描画する情報を ID と関連付けているから、それが指定できない――ということであれ
ば、ID とではなく、ユーザ定義の値(MENUITEMINFO 構造体の dwItemData)と関連付け
ればよいのではないでしょうか。
これなら MEASUREITEMSTRUCT / DRAWITEMSTRUCT にも itemData という形で渡されます
し。
一番上のメニューはオーナードローできないらしいです。
Excel はというと…あれはメニューじゃないんじゃないでしょうか。
本来はできないはずのフローティングをやってたりしますし。
コマンドバーと呼ばれるものらしいです。
ありがとうございます。
おかげでPOPUPもオーナードローできそうです。
これならSEPARATORもオーナードローできそうですね。
一番上は・・・とりあえずあきらめます。
THE CODE PROJECTというサイトにオフィス風のメニューやコントロールを実装している
サンプルがあるようなので、機会があれば会席してみよう、とは思ってます。
#しかしあれがメニューじゃないってのはちょっとショックでした。
ミス
会席 → 解析
解決しているようですが。
> でもIDのないポップアップ項目はどうやって描画するのでしょうか?
AppendMenuではIDのところにサブメニューのHMENUを指定します。
なので、DRAWITEMSTRUCT,MEASUREITEMSTRUCTのitemIDメンバが
実はHMENUであるかどうかを確認すれば、分かります。
> 一番上のメニューはオーナードローできないらしいです。
ちょっと試してみたのですが、できるようですよ。
> ちょっと試してみたのですが、できるようですよ。
そでしたか。
試してみて言っている訳ではないので、失礼しました。
猫など複数のサイトで、ウィンドウメニューのオーナードローは出来ないと書いてあっ
たので、そういうもんだと思ってました。
ありがとうございます。
サブメニューのハンドルをIDとして使えるわけですね。
そう考えると一番上のもオーナードローできそうですね。
解決済みなのですが、これで本当の解決ですね。