メニューバーの項目にカーソルを合わせた時、その項目がボコってでっぱりますよね?
(これはクラシックスタイルの場合で、XPスタイルだと色が変わりますね)
これをオーナードローでも再現したいのですが、どうやったらカーソルが項目にあるか
を判定できるのでしょうか?
GetMenuItemInfo()でメニューの状態を取得しても、この部分の情報ってMENUITEMINFO構
造体の中には無さそうですし、DRAWITEMSTRUCT内にも無さそうです。
カーソル位置を常にチェックするしかないのでしょうか?
環境はWinXPSP2 VC++.net2002
MFCは使用していません。
>DRAWITEMSTRUCT内にも無さそうです。
itemActionがODA_FOCUSの時に
itemStateにODS_FOCUSがセットされていませんか?
注) フォーカスを失う時にもODA_FOCUSがきます。
ありがとうございます。
今試してみましたが、肝心の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()を行っています。
これ以外に何か別な処理が必要なのでしょうか?
とりあえずカーソルがメニュー上に来た時にボコっとさせる以外はうまくいっているの
ですが・・・
あ、ごめんなさい。ODA_FOCUSきませんでしたか。
当方、MFCのCreatePopupMenuで作成、AppendMenuで追加しているので、
なぜこないかはわかりません。(Popupしか作ったことないんです。)
お力になれなくてすみませんでした。
ありがとうございます。
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が立っているかをチェックすれば良いようです。
実際、これでうまくいきました。
追加
解決したのですが、疑問点。
結局256(0x0100)が意味する内容は不明のままです。
winuser.hにもそれらしき物はありませんでした。
・・・裏フラグ、なのでしょうか?