こんばんわ.
追加したメニューのコマンド?を取得できずに困って
います。ご教授いただければ幸いです。
環境:WinXP_Pro, VC++6.0, SDI, MFCを主に使用しています。
CMenu *pmenu = AfxGetMainWnd()->GetMenu();
CMenu *pmenu2 = pmenu ->GetSubMenu(2);
pmenu2 ->AppendMenu(MF_STRING,0,_T(てすと));
でメニューを動的に追加できたのですが、追加した「てすと」の
コマンド?(クリックされたかどうか)を取得する方法がわかりません。
どうかよろしくお願いいたします。
virtual BOOL OnCmdMsg(
UINT nID,
int nCode,
void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo
);
を再定義すればいい。第1引数にコマンドIDが入っているはず。
レスどうもありがとうございます。
早速,OnCmdMsgをクラスウィザードで追加
いたしましたが、追加したメニューのIDがわかりませんでした。
そこでいろいろ調べて以下のコードを作りました。
VC++,SDI,FormViewでスケルトンを作成。
リソースエディタでメニューバーの編集の隣に「てすと」を作成。
resource.hに「#define ID_PROPERTY_MENU 150」を追加。
//View.cpp
int i = 0;
CMenu *menu = AfxGetMainWnd()->GetMenu();
CMenu *lmenu = menu->GetSubMenu(2);
for(i=0; i<5; i++)
{lmenu->AppendMenu(MF_STRING,ID_PROPERTY_MENU+i, _T(追加));}
//OnCmdMsg
if( pHandlerInfo == NULL ){
if(nID == (UINT)(ID_PROPERTY_MENU+1)){
AfxMessageBox(チェック);
}
}
としましたがこれでは「てすと」以下にメニューを追加できませんでした。
そこで、リソースエディタで「てすと」の下にセパレータを入れたところ
「追加」メニューが挿入できましたが、淡色表示で、「てすと」をクリックした
だけで、メッセージボックスがでてしまいます。
何がいけないのでしょうか?ご教授のほどよろしくお願いいたします。
> 「てすと」をクリックしただけで、メッセージボックスがでてしまいます。
OnCmdMsg()はメニューが選択されたとき以外に、
メニューの表示状態(有効無効、チェックの有無等)を決定する時に呼ばれるからです。
それを場合分けしないと全てのタイミングでメッセージボックスが出てしまいます。
> リソースエディタでメニューバーの編集の隣に「てすと」を作成。
> ・・・
> としましたがこれでは「てすと」以下にメニューを追加できませんでした。
もしかして失敗した時はリソースエディタで「てすと」のサブメニューが
何もない状態になっていませんでしたか?
サブメニューがないアイテム「てすと」にGetSubMenu()をしても失敗します。
すでに試しているように、サブメニューにダミーの項目を追加しておくか、
もしくは項目を追加する前に自前で作成したサブメニューを
「てすと」の項目に関連付けてやればいいでしょう。
あと、動的にメニューを追加する方法を解説したページがあるので
参考にしてみてください
http://www.kab-studio.biz/Programing/Codian/index.html
の「MFCチップス」のところにあります。
憂さま、レスどうもです。
>OnCmdMsg()はメニューが選択されたとき以外に、
>メニューの表示状態(有効無効、チェックの有無等)を決定する時に呼ばれるからです。
>それを場合分けしないと全てのタイミングでメッセージボックスが出てしまいます。
コードを以下に変更すればいけそうですね?
//OnCmdMsg
if( pHandlerInfo == NULL ){
if(nID == (UINT)(ID_PROPERTY_MENU+1)){
if( nCode == CN_COMMAND ){
AfxMessageBox(チェック);
}}}
>もしかして失敗した時はリソースエディタで「てすと」のサブメニューが
>何もない状態になっていませんでしたか?
>サブメニューがないアイテム「てすと」にGetSubMenu()をしても失敗します。
そのとうりで、何もないとGetSubMenu()の戻り値は不定(0x0)でした。
>すでに試しているように、サブメニューにダミーの項目を追加しておくか、
ダミーの項目を削除後追加はokなのでしょうか?
>もしくは項目を追加する前に自前で作成したサブメニューを
>「てすと」の項目に関連付けてやればいいでしょう。
すいません、理解できませんでした。具体的に教えてください。
現在、環境がないので試せません。やってからまたレスいたします。
参考になるHPお教えいただきありがとうございました。
>> もしくは項目を追加する前に自前で作成したサブメニューを
>> 「てすと」の項目に関連付けてやればいいでしょう。
> すいません、理解できませんでした。具体的に教えてください。
まずは自分で検索する癖をつけるようにしましょう
メニュー操作に関しては紹介しているサイトも多いでしょうから見つけやすいと思いま
す
Googleで「サブメニュー 追加 MFC」をキーワードに検索したら
とりあえずひとつ見つかりました
http://www.kab-studio.biz/Programing/PragmaTwice/Main/165.html
あとMFCじゃないけどもうひとつ
http://wisdom.sakura.ne.jp/system/winapi/win32/win80.html
MFCでも結局やることはほとんど同じなんで、読んでおくと理解が深まると思います