メニューバーのオーナードローについて – プログラミング – Home

メニューバーのオーナードローについて
 
通知
すべてクリア

[解決済] メニューバーのオーナードローについて


お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

メニューバーの項目にカーソルを合わせた時、その項目がボコってでっぱりますよね?
(これはクラシックスタイルの場合で、XPスタイルだと色が変わりますね)

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

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

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


引用未解決
トピックタグ
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
 

>DRAWITEMSTRUCT内にも無さそうです。
itemActionがODA_FOCUSの時に
itemStateにODS_FOCUSがセットされていませんか?

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


返信引用
お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

ありがとうございます。
今試してみましたが、肝心の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()を行っています。
これ以外に何か別な処理が必要なのでしょうか?

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


返信引用
ゆう
 ゆう
(@ゆう)
ゲスト
結合: 23年前
投稿: 114
 

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


返信引用
お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

ありがとうございます。
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が立っているかをチェックすれば良いようです。
実際、これでうまくいきました。


返信引用
お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

追加

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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