• 締切済み

メニューバーでクリックした個々のメニューのキャプションとプロンプト変更

VC++6.0 で メニューバーでクリックした個々のメニューの文字を変更しようとして、 void C~View::OnUpdate~(CCmdUI* pCmdUI) { if( ~flg ) pCmdUI->SetText( "文字1" ); else pCmdUI->SetText( "文字2" ); } でメニューの文字自体は切替出来たのですが、 ステータスバーには リソースビュー上でメニューのプロパティの "プロンプト"エディットボックスに入力した文字列は そのまま表示されてしまっていました。 ステータスバー側の文字列を変更することは可能なのでしょうか?

みんなの回答

回答No.1

 こんにちは。  此のプロンプト文字列はストリングテーブルのリソースから読み込んで来たモノの様ですが、プログラム内のドコに格納されているかがまるで分かりません。  プログラム実行中にストリングテーブルを書き換える事も出来ない様なので、最終手段として、動的確保したCStringのポインタをMENUITEMINFO::dwItemDataに突っ込んでメニューアイテムに設定した後、オーバーライドしたOnMenuSelect()の中で取り出して、ステータスバーに送り届ける処理をする位しか思い浮かびません。  「OnMenuSelect()」  http://msdn.microsoft.com/ja-jp/library/hd5h5a75(VS.80).aspx  「MENUITEMINFO」  http://msdn.microsoft.com/en-us/library/ms647578(VS.85).aspx  強引な上に改良の余地もありますが、以下参考程度に。 //ビューウィンドウ側 void CTestView::OnUpdateFileNew(CCmdUI* pCmdUI) { // TODO: この位置に command update UI ハンドラ用のコードを追加してください //アイテム名の変更 pCmdUI->SetText(TEXT("変更 新規作成")); //自由データにステータスバーへ表示する為のCStringを割り当てて、突っ込んでおく MENUITEMINFO mii = {sizeof(mii), MIIM_DATA}; mii.dwItemData = (DWORD)new CString(TEXT("変更 新規作成 ステータスバー")); ::SetMenuItemInfo(pCmdUI->m_pMenu->GetSafeHmenu(), pCmdUI->m_nID, FALSE, &mii); } //メインフレーム側 void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu) { CMenu* pMenu = NULL; UINT uiMenuID = nItemID; //ポップアップ位置が押された時 if(nFlags & MF_POPUP) { pMenu = CMenu::FromHandle(hSysMenu); if(pMenu) { uiMenuID = pMenu->GetMenuItemID(nItemID); } } //通常のアイテム位置が押された時 else { pMenu = CMenu::FromHandle(::GetMenu(this->GetSafeHwnd())); } //取り出せなかったので引き返す if(pMenu == NULL) return; //CStringの取り出しを試みる MENUITEMINFO mii = {sizeof(mii), MIIM_DATA}; pMenu->GetMenuItemInfo(uiMenuID, &mii); //無かったので基本クラスへ投げ飛ばす if(mii.dwItemData == 0) { CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); } //見つかったのでステータスバーに表示する else { CString* pString = (CString*)mii.dwItemData; this->m_wndStatusBar.SetWindowText(*pString); } }

alna_sag
質問者

お礼

丁寧な回答ありがとうございます。 御礼が遅くなってしまいました。すみません。 現状のアプリでステータスバーを見てみたのですが、 メニュー操作していない時 "レディ"(半角カナで表示) MF_POPUPの時    非表示 セパレータ     非表示 と表示されるようですので、machongolaさんのコードを参考に //無かったので基本クラスへ投げ飛ばす の行以降を if(mii.dwItemData == 0) { if(nFlags & MF_POPUP)//ポップアップ位置が押された時 { CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); this->m_wndStatusBar.SetWindowText( "" );//空白にする } else//それ以外の場合 { this->m_wndStatusBar.SetWindowText( "" );//空白にする //無かったので基本クラスへ投げ飛ばす CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu); } } //見つかったのでステータスバーに表示する else { CString* pString = (CString*)mii.dwItemData; this->m_wndStatusBar.SetWindowText(*pString); } としてみました。 セパレータの場合のみ空白にしたかったのですが、 わからなかったので基本クラスに飛ばす前に 空白にしてみました。 律儀にステータスバーに表示してしまったので 思わぬところで引っかかってしまいました。 とても助かりました。 ありがとうございました。

関連するQ&A

専門家に質問してみよう