追加したメニューのコマンドに関して – プログラミング – Home

追加したメニューのコマンドに関して
 
通知
すべてクリア

追加したメニューのコマンドに関して


PlayBoy
 PlayBoy
(@PlayBoy)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

こんばんわ.

追加したメニューのコマンド?を取得できずに困って
います。ご教授いただければ幸いです。

環境:WinXP_Pro, VC++6.0, SDI, MFCを主に使用しています。

CMenu *pmenu = AfxGetMainWnd()->GetMenu();
CMenu *pmenu2 = pmenu ->GetSubMenu(2);
pmenu2 ->AppendMenu(MF_STRING,0,_T(てすと));

でメニューを動的に追加できたのですが、追加した「てすと」の
コマンド?(クリックされたかどうか)を取得する方法がわかりません。

どうかよろしくお願いいたします。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

virtual BOOL OnCmdMsg(
UINT nID,
int nCode,
void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo
);

を再定義すればいい。第1引数にコマンドIDが入っているはず。


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

レスどうもありがとうございます。

早速,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(チェック);
}
}

としましたがこれでは「てすと」以下にメニューを追加できませんでした。

そこで、リソースエディタで「てすと」の下にセパレータを入れたところ
「追加」メニューが挿入できましたが、淡色表示で、「てすと」をクリックした
だけで、メッセージボックスがでてしまいます。

何がいけないのでしょうか?ご教授のほどよろしくお願いいたします。


返信引用
憂
 憂
(@憂)
ゲスト
結合: 21年前
投稿: 72
 

> 「てすと」をクリックしただけで、メッセージボックスがでてしまいます。

OnCmdMsg()はメニューが選択されたとき以外に、
メニューの表示状態(有効無効、チェックの有無等)を決定する時に呼ばれるからです。
それを場合分けしないと全てのタイミングでメッセージボックスが出てしまいます。

> リソースエディタでメニューバーの編集の隣に「てすと」を作成。
> ・・・
> としましたがこれでは「てすと」以下にメニューを追加できませんでした。

もしかして失敗した時はリソースエディタで「てすと」のサブメニューが
何もない状態になっていませんでしたか?
サブメニューがないアイテム「てすと」にGetSubMenu()をしても失敗します。

すでに試しているように、サブメニューにダミーの項目を追加しておくか、
もしくは項目を追加する前に自前で作成したサブメニューを
「てすと」の項目に関連付けてやればいいでしょう。

あと、動的にメニューを追加する方法を解説したページがあるので
参考にしてみてください

http://www.kab-studio.biz/Programing/Codian/index.html

の「MFCチップス」のところにあります。


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

憂さま、レスどうもです。

>OnCmdMsg()はメニューが選択されたとき以外に、
>メニューの表示状態(有効無効、チェックの有無等)を決定する時に呼ばれるからです。
>それを場合分けしないと全てのタイミングでメッセージボックスが出てしまいます。

コードを以下に変更すればいけそうですね?
//OnCmdMsg
if( pHandlerInfo == NULL ){
if(nID == (UINT)(ID_PROPERTY_MENU+1)){
if( nCode == CN_COMMAND ){
AfxMessageBox(チェック);
}}}

>もしかして失敗した時はリソースエディタで「てすと」のサブメニューが
>何もない状態になっていませんでしたか?
>サブメニューがないアイテム「てすと」にGetSubMenu()をしても失敗します。

そのとうりで、何もないとGetSubMenu()の戻り値は不定(0x0)でした。

>すでに試しているように、サブメニューにダミーの項目を追加しておくか、

ダミーの項目を削除後追加はokなのでしょうか?

>もしくは項目を追加する前に自前で作成したサブメニューを
>「てすと」の項目に関連付けてやればいいでしょう。

すいません、理解できませんでした。具体的に教えてください。

現在、環境がないので試せません。やってからまたレスいたします。
参考になるHPお教えいただきありがとうございました。


返信引用
憂
 憂
(@憂)
ゲスト
結合: 21年前
投稿: 72
 

>> もしくは項目を追加する前に自前で作成したサブメニューを
>> 「てすと」の項目に関連付けてやればいいでしょう。

> すいません、理解できませんでした。具体的に教えてください。

まずは自分で検索する癖をつけるようにしましょう
メニュー操作に関しては紹介しているサイトも多いでしょうから見つけやすいと思いま

Googleで「サブメニュー 追加 MFC」をキーワードに検索したら
とりあえずひとつ見つかりました

http://www.kab-studio.biz/Programing/PragmaTwice/Main/165.html

あとMFCじゃないけどもうひとつ

http://wisdom.sakura.ne.jp/system/winapi/win32/win80.html

MFCでも結局やることはほとんど同じなんで、読んでおくと理解が深まると思います


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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