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

[戻る]
お茶 2005/05/11(水) 22:08:43
メニューバーの項目にカーソルを合わせた時、その項目がボコってでっぱりますよね?
(これはクラシックスタイルの場合で、XPスタイルだと色が変わりますね)

これをオーナードローでも再現したいのですが、どうやったらカーソルが項目にあるか
を判定できるのでしょうか?

GetMenuItemInfo()でメニューの状態を取得しても、この部分の情報ってMENUITEMINFO構
造体の中には無さそうですし、DRAWITEMSTRUCT内にも無さそうです。
カーソル位置を常にチェックするしかないのでしょうか?

環境はWinXPSP2 VC++.net2002
MFCは使用していません。

ゆう 2005/05/11(水) 22:59:38
>DRAWITEMSTRUCT内にも無さそうです。
itemActionがODA_FOCUSの時に
itemStateにODS_FOCUSがセットされていませんか?

注) フォーカスを失う時にもODA_FOCUSがきます。

お茶 2005/05/12(木) 22:00:31
ありがとうございます。
今試してみましたが、肝心のODS_FOCUSがセットされません(ODS_SELECTEDはOKです)
というか、ODA_FOCUS自体がセットされないようです。
コードはこんな感じです。

// メニュー描画
// これはWM_DRAWITEMが飛んできたら呼ばれます。
// (当然LPARAMをDRAWITEMSTRUCT *にキャストしてます)
void DrawMenu(DRAWITEMSTRUCT *pDIS)
{
  if (pDIS->CtlType != ODT_MENU) return;

  if(pDIS->itemState & ODS_FOCUS){
     // フォーカス来たのでボコっと出っ張らせる
     // でもこの中の処理が行われることはないです・・・
  }
  .
  . 以下略します
  .
}
DrawMenu()内でpDIS->itemActionにODA_FOCUSがセットされたらメッセージボックスを
出すようにしてもメッセージボックスは出てきません。

メニューをオーナードロータイプにするのには、GeMenuItemInfo()でメニューの情報
を取得し、fTypeにMFT_OWNEWDRAWをセットしてSetMenuItemInfo()を行っています。
これ以外に何か別な処理が必要なのでしょうか?

とりあえずカーソルがメニュー上に来た時にボコっとさせる以外はうまくいっているの
ですが・・・

ゆう 2005/05/13(金) 00:27:35
あ、ごめんなさい。ODA_FOCUSきませんでしたか。
当方、MFCのCreatePopupMenuで作成、AppendMenuで追加しているので、
なぜこないかはわかりません。(Popupしか作ったことないんです。)
お力になれなくてすみませんでした。

お茶 2005/05/13(金) 14:23:11
[[解決]]
ありがとうございます。
SPYで確認しましたが、カーソルをメニューに持っていくと確かにWM_DRAWITEMが飛んで
きました。
その際、itemActionはODA_DRAWENTIREでした。
で、問題はitemStateでして、その値は320でした。
つまり64 + 256ですので2つのフラグが立っているようです。
これが何かとMSDNで調べますと・・・

 ODS_SELECTED     = 1
 ODS_GRAYED       = 2
 ODS_DISABLED     = 4
 ODS_CHECKED      = 8
 ODS_FOCUS        = 16
 ODS_DEFAULT      = 32
 ODS_COMBOBOXEDIT = 4096

・・・って64と256は!?
仕方ないのでwinuser.hを調べた所、

 #if(WINVER >= 0x0500)
 #define ODS_HOTLIGHT        0x0040
 #define ODS_INACTIVE        0x0080
 #endif /* WINVER >= 0x0500 */

・・・だそうです。
つまり、ODS_HOTLIGHTが立っているかをチェックすれば良いようです。
実際、これでうまくいきました。

お茶 2005/05/13(金) 15:25:58
追加

解決したのですが、疑問点。
結局256(0x0100)が意味する内容は不明のままです。
winuser.hにもそれらしき物はありませんでした。

・・・裏フラグ、なのでしょうか?

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