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
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/5642067
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック