2007年10月07日

メニューの取得

前にSHGetSubMenuを使ってメニューを取得する方法を書きました。
pDiceではこれで問題なかったんだけど、右ソフトキーのメニューが取得できないことが本日判明。

さらに色々試してみてわかったのが以下の方法。これでようやく、左右両方のソフトキーメニューが取れました。

TBBUTTONINFO tbbi = {0};
tbbi.cbSize = sizeof(tbbi);
tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;
m_wndCommandBar.SendMessage(TB_GETBUTTONINFO,menuno, (LPARAM)&tbbi);
HMENU hMenu = (HMENU)tbbi.lParam;


#TBGETBUTTONINFOでメニューハンドルが取れるなんて、わからないよ……。orz

#pDiceもそのうち書き換えなきゃ。
posted by Jiro at 20:13 | Comment(0) | TrackBack(0) | 開発Tips

2007年09月29日

WMのコマンドバーのこと

MFCにはCCommandBarクラスというのがあって
コマンドバーのAPIをカプセル化しています。

コマンドバーからメニューを取りたい時は
CCommandBar::GetMenu()メンバ関数で、HMENUがとれて、
CMenuを構築することでメニューにアクセスできます。

HMENU hmenu = m_wndCommandBar.GetMenu();
CMenu *pMenu= CMenu::FromHandle( hmenu );
CMenu *pSubMenu = pMenu->GetSubMenu(0);

これで、サブメニューにアクセスできます。

ただし、これは本物ではなく、コピーです。
ここで取れたpSubMenu->AppendMenu()しても実際のメニューに項目は追加されません。

こういう事がしたいときは、

HMENU hmenu = SHGetMenu( m_wndCommandBar.m_hCommandBar );

とやって、本物のHMENUを取りましょう。

ただし、これはなぜかPPCではNULLが帰ってきます。SPだと動いたのに。(おいらの環境だけかも)

実際に動いたのは、

#define SHGetSubMenu(hWndMB,ID_MENU) (HMENU)::SendMessage((hWndMB), SHCMBM_GETSUBMENU, (WPARAM)0, (LPARAM)ID_MENU);

HMENU hmenu = SHGetSubMenu( m_wndCommandBar.m_hCommandBar ,0 );

とやって、サブメニューを直接取得する方法だけでした。

SHGetSubMenu()もヘルプにはエントリがあるのに、なぜか定義されていない謎のマクロ。

まあ、動いたからよしとするか。

[10/7追記]
上記方法では右が取れません。
こっちに書きました。
posted by Jiro at 20:37 | Comment(0) | TrackBack(0) | 開発Tips

2007年09月25日

メニューバーとリソースの関係

MFCでWMアプリを作るとき、*.rc2の以下の赤字の部分をコメントアウトすると、メニューリソースが直接メニューバーとして扱える。

/////////////////////////////////////////////////////////////////////////////
//
// SHMENUBAR
//

IDR_MAINFRAME SHMENUBAR DISCARDABLE
BEGIN
IDR_MAINFRAME,
2,

I_IMAGENONE, ID_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_NEW, 0, NOMENU,

I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE,
IDS_MENU, 0, 0,
END


これがわかるまで結構悩みました。
このリソースが定義されてると、メニューリソースよりも優先される模様。
逆に言うとSHMENUBARリソースはなくても大丈夫。
#じゃあなんでMSはこんなのをデフォルトで登録するんだろ?

ちなみに、ダイアログベースで作ったアプリの最初の画面だけはこの手が効かない。理由はわかんない。

posted by Jiro at 15:15 | Comment(0) | TrackBack(1) | 開発Tips