• 締切済み

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

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

  • メニューバーのメニューメッセージについて

    メニューバーのメニューの上にマウスが乗った時にWM_MENUSELECT が送られてくるのはわかったのですが、下記のリソースファイルで※1や※2のところで同じようにマウスが乗った時かどうかを調べるにはどうしたらいいですか? ステータスバーに文字を表示したいのですが、※1や※2のところの場合はどうしたらいいのかわかりません。 //リソースファイル IDR_ID1 MENU BEGIN  POPUP "ファイル"//※1  BEGIN    MENUITEM "新規" IDM_1     POPUP "オプション"//※2     BEGIN       MENUITEM "項目1"  IDM_2     END  END END // あと、VisualStudio2010で開発していて、MFCは使用していません。 よろしくお願いします。

  • VC++ MFCButton マウスが通過するときの文字列を後から変更するには?

    お世話になります。 VC++ 2008で、CMFCButtonをダイアログに貼り付けています。 マウスが上を通過したとき、ステータスバーに文字列が表示される しくみがあり、それを使っています。 文字列は、XXXXX\nYYYで、YYYがツールチップ、XXXXXがステータスバーに 表示される文字列としてリソースで定義してあります。 また、そのリソース名をボタンのリソース名としています。 DDXで、メンバーのボタンとリソースIDを関連付けています。 (普通の使い方だと思います) 動作もうまくいっていますが、ステータスバーに表示する説明文を 起動後にダイナミックに変更する必要が出てきました。 ボタンの意味が変わる状況があるからです。 さて、マウスが通過するときの文字列を後から変更するには、どうしたらいいでしょうか?

  • MFCのキャプション変更

    はじめまして。 環境はVC++6.0 XPです。 MFCでのあるプログラムの中で CWnd* pWnd = GetDlgItem( IDC );//EditBox pWnd->SetWindowText( hoge); SetWindowText( hoge );//hogeは文字列が入った変数 というコードがあるのですが、 このhogeの中にはハングル文字(韓国語)が入っていており、エディットボックスにはちゃんと韓国語が入っているのですが、ウィンドウのタイトルバーには?が入っていてちゃんと表示されていません。 どうすれば表示できるのか教えてください。

  • VC++2010 ボタンなどのレイアウト大きさ変更

    VC++2010のMFCで現在開発しているんですが、 ボタン、スタティックテキスト、エディットボックスの文字の大きさを変更したいんですが どのようにすればいいかわかりません。よろしくお願いします。 またステータスバーに色を付けたいんですがどのようにすれば色を付けることができますか? よろしくお願いします。

  • String Table リソースを条件によって切り換えたい(VS2005)

    Visual Studio2005 VC++ のリソースビューに含まれる、String Table の内容を条件によって切り換えたいと考えています。 (より具体的には IDR_MAINFRAMEの文字列だけ変更できればよいのですが。) String Table以外のリソースであれば、プリプロセッサの定義によって内容を変更できますが、String Tableだけは例外的に切り替えられないようです。 何かよい方法をご存知の方はご教授いただけますと幸いです。

  • エディットボックスのカーソル取得方法

    複数のエディットボックスがあり、マウスで選択したエディットボックスに文字列を表示させたいのですが、うまくいきません。使用ツールはVC++です。

  • メニューバーのショートカットキー(Win32API)

    リソーススクリプトとWin32APIでメニューバーの付いているウィンドウズアプリケーションを作りました。 メニュー内のポップアップはAlt+キーで開けるように"ポップアップの文字列(&H)"としておいたのですが、実際にショートカットで開こうとすると、Alt押しっぱなし+キーでは開けず、Altを押してメニューバーを選択状態にした後にキーで選択する、といった風にしか開けませんでした。 しかし多くのアプリケーションではAlt押しっぱなし+キーでもポップアップが開けます。そうする為にはWM_SYSKEYDOWNを処理してポップアップを開くようにする以外に方法はないでしょうか? 回答よろしくお願いします。

  • エディットボックスに入力されている文字列が、スペースだけで構成されているかどうか。

    VC++6.0・Win32APIを用いて、ウィンドウズアプリケーションを作成しています。 エディットボックスに入力されている文字列が、スペース(全角スペース又は半角スペース)のみ (それらの組み合わせでも構わない)で構成されているかどうかを判別するアルゴリズムを教えてください。 ヒントでも構いません。 エディットボックスの作成や、そこからの文字列の取得については理解しています。 あっ、でもよく考えてみたらエディットボックスかどうかは関係ないですね(^_^;) 『ある文字列が・・・』で十分ですね。 お手数をお掛けしますが、よろしくお願いいたします。

  • 【.NET】文字列の管理方法、メッセージボックスボタン名の編集について

    VC++2005の.NETでアプリを作成しております。言語はC++/CLIです。 いきなり複数の質問で申し訳ありませんが、二点質問があります。 (1) .NETでの文字列管理はどのように管理するのが理想的なのでしょうか? 例えば、MFCであればリソースビューのストリングテーブルで管理する方法がありましたが、 .NETではそれが見当たらなく、コード中に直接書くのも悪いような気がするので質問させて頂きました。 (2) メッセージボックスのボタン名を任意の文字列に変更するにはどうすれば良いのでしょうか? 例えば、下記コードで出現するメッセージボックスの、「OK」と「キャンセル」を、 文字列「aaa」「bbb」に変更する方法について、ご教示お願い致します。

  • コマンドプロンプトでファイル名一括変更

    コマンドプロンプトのrenコマンドでフォルダ内の同一拡張子のファイル名の拡張子を一括変更することはできますが、 (例 ren *.txt *.htm ) 拡張子以外の共通部分を拡張子を含む形で一括変更することはできませんか? たとえば拡張子のないd01という文字列で終わるファイル名を一括してd01の部分を消して拡張子を.jpgにしたいのです。

専門家に質問してみよう