オーナードローメニューについて

[戻る]
お茶 2004/11/19(金) 23:04:35
WM_DRAWITEMでメニューを独自に描画しているのですが、
普通のメニューアイテムはDRAWITEMSTRUCTのitemIDで識別して描画できます。
でもIDのないポップアップ項目はどうやって描画するのでしょうか?
ついでに一番上のメニューもどうやって描画したらいいのかも知りたいです。
一番上とは、タイトルバーの下のファイル・編集といったやつです。
エクセル等のようにしたいので・・・

環境はVC++6.0SP6 WinXPSP2 MFC未使用です。
よろしくお願いします。

Azzy 2004/11/20(土) 17:23:33
>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を使うほうがいいかもしれません)

>エクセル等のようにしたいので
メニューを動かすことができるようにしたいのでしょうか?
それならば、メニューをオーナードローするよりも、
リバーコントロールにメニューを置いたほうがいいかもしれません。

シャノン 2004/11/21(日) 04:33:13
ポップアップの親メニューでも、MEASUREITEMSTRUCT / DRAWITEMSTRUCT の itemID メン
バには何らかの有効な ID が入るようですので、GetMenuItemInfo によってアイテム情
報を取得することは可能です。

描画する情報を ID と関連付けているから、それが指定できない――ということであれ
ば、ID とではなく、ユーザ定義の値(MENUITEMINFO 構造体の dwItemData)と関連付け
ればよいのではないでしょうか。
これなら MEASUREITEMSTRUCT / DRAWITEMSTRUCT にも itemData という形で渡されます
し。

一番上のメニューはオーナードローできないらしいです。
Excel はというと…あれはメニューじゃないんじゃないでしょうか。
本来はできないはずのフローティングをやってたりしますし。
コマンドバーと呼ばれるものらしいです。

お茶 2004/11/22(月) 12:12:44
[[解決]]
ありがとうございます。
おかげでPOPUPもオーナードローできそうです。
これならSEPARATORもオーナードローできそうですね。

一番上は・・・とりあえずあきらめます。

THE CODE PROJECTというサイトにオフィス風のメニューやコントロールを実装している
サンプルがあるようなので、機会があれば会席してみよう、とは思ってます。

#しかしあれがメニューじゃないってのはちょっとショックでした。

お茶 2004/11/22(月) 12:13:29
ミス
会席 → 解析

dairygoods 2004/11/22(月) 15:04:07
解決しているようですが。

> でもIDのないポップアップ項目はどうやって描画するのでしょうか?

AppendMenuではIDのところにサブメニューのHMENUを指定します。
なので、DRAWITEMSTRUCT,MEASUREITEMSTRUCTのitemIDメンバが
実はHMENUであるかどうかを確認すれば、分かります。


> 一番上のメニューはオーナードローできないらしいです。

ちょっと試してみたのですが、できるようですよ。

シャノン 2004/11/22(月) 18:31:56
> ちょっと試してみたのですが、できるようですよ。

そでしたか。
試してみて言っている訳ではないので、失礼しました。
猫など複数のサイトで、ウィンドウメニューのオーナードローは出来ないと書いてあっ
たので、そういうもんだと思ってました。

お茶 2004/11/23(火) 07:07:35
ありがとうございます。

サブメニューのハンドルをIDとして使えるわけですね。
そう考えると一番上のもオーナードローできそうですね。

解決済みなのですが、これで本当の解決ですね。

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