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

このQ&Aのポイント
  • メニューバーの上にマウスが乗った時にWM_MENUSELECTが送られてくる。
  • リソースファイルで同じようにマウスが乗った時かどうかを調べる方法は何か。
  • ステータスバーに文字を表示する方法がわからない。
回答を見る
  • ベストアンサー

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

メニューバーのメニューの上にマウスが乗った時に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は使用していません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

どちらもWM_MENUSELECTからどう判定したらいいのか判らない。 ということでしょうか? HIEORD(wParam)でMF_POPUPがついて、LOWORD(wParam)が0なら※1、LOWORD(wParam)が1なら※2になるかと。 IDM_1とPOPUP "オプション"の位置が入れ替わるとLOWORD(wParam)で判定できなくなるかも知れませんが、lParamのメニューハンドルが異なるはずなのでそちらで判定できると思われます。 GetMenu()やGetSubMenuでメニューハンドル取得できますし。 リソースでない場合は… http://eternalwindows.jp/winbase/menu/menu04.html こちらで書かれている方法で対処できそうですが…。

Michigami
質問者

お礼

ありがとうございます ※2のほうはGetSubMenuなどを使用しました

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

ぐぁ… HIEORD(wParam)はHIWORD(wParam)です。

関連するQ&A

  • メニューの書式

    下の終了(&E)という文字を非活性にしたいのですが、リソースでそのようなスタイルっぽいことは指定できるのでしょうか? MENUITEM "終了(&E)", IDM_EXIT, DISABLED のような書式はないのでしょうか? #include "example.h" PROGRAM MENU DISCARDABLE BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "開く(&A)...", IDM_OPEN MENUITEM SEPARATOR MENUITEM "終了(&E)", IDM_EXIT END POPUP "ヘルプ(&H)" BEGIN MENUITEM "バージョン情報(&A)", IDM_ABOUT MENUITEM "ヘルプを表示(&H)", IDM_HELP END END

  • メニューリソースのオプションのGRAYEDについて

    IDR_MENU1 MENU { POPUP "ファイル(&F)" { MENUITEM "新規作成(&N)",IDM_NEW MENUITEM "終了(&X)",IDM_EXIT,GRAYED } POPUP "ヘルプ(&H)",GRAYED { MENUITEM "バージョン情報(&V)",IDM_VERSION } } このコードでGRAYDに指定しているコマンド"終了"の文字が灰色にならず、選択可能になります。どうしたらGRAYEDの設定が反映されるでしょうか?

  • コマンドバーに配置したコマンド(ボタン?)をコマンド入力でHIDDENにしたい

    現在、eMbedded Visual C++ 3.0を使い、PocketPc用のアプリケーションを作っています。 MFCは使わずにAPIオンリーです。 ターゲットはCASSIOPEIA E800 ちょっとマイナー?ですが、産業用PDAです。 アプリケーションの下部にコマンドバーを配置し、バージョン情報などを表示させています。 二つ作ったコマンドのうち一つを開発段階のデバッグ用に使用したいと思っています。 デバッグ用コマンドのほうは普段(一般ユーザに)は見えなくなっていて 隠しコマンド入力で表示されるようにしたいのです。 メニューアイテムプロパティーの中にある非表示チェックボタンをチェックすると デバッグ用コマンドの表示が消え、リソースファイル"| TBSTATE_HIDDEN" が追加されます。 従って、ソースコード内でTBSTATE_HIDDENを操作すればいいとは思いますが、 その操作方法について調べてもわかりませんでした。 やりかたを教えてください。よろしくお願いします。 因みに、リソースファイルは下記になっています。 /****************************************************************************/ IDM_MENU SHMENUBAR MOVEABLE PURE BEGIN IDM_MENU, 3, I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 0, I_IMAGENONE, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0, NOMENU, I_IMAGENONE, IDM_MAIN_COMMAND2, TBSTATE_ENABLED | TBSTATE_HIDDEN, ←--ここ TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_DEBUG, 0, 1, END /****************************************************************************/

  • タスクバーのメニュー表示

    Visual C++ 6.0 MFCにて質問があります。 [環境] Visual C++ 6.0 MFC [タスクバーのアイコンの処理] リソースにMenuを作成して、以下のソースを作成いたしました。しかし、タスクバーのアイコンをクリックして、Menuが表示されるはずなのですが、途中でエラーが出てしまいます。CMenu* pMenu;がうまく処理されていないみたいなのですが、ソース的に問題ないように思うのですが.... 何か問題があるのでしょうか?? [ソース] CMenu MyMenu; CMenu* pMenu; POINT pt; // 現在のカーソル位置を取得 ::GetCursorPos(&pt); // フォーカスを当てる SetFocus(); // メニューのロード VERIFY(MyMenu.LoadMenu(IDR_MENU1)); // 0番目のメニューを取得 pMenu = MyMenu.GetSubMenu(0); ASSERT(pMenu != NULL); <-- ここでエラーがでる。 // メニューの表示 if(pMenu->TrackPopupMenu( TPM_LEFTALIGN| TPM_RIGHTBUTTON, pt.x, pt.y , this) == 0){ return FALSE; } // メッセージを送る PostMessage(WM_NULL); return TRUE;

  • MFCのメニューバーのイベント取得

    イベント取得に苦戦しております。 環境は、 Microsoft Visual Studio 2008 Professional Edition - JPN MDIです。 取得したいイベントなのですが、 メニューバーの「Windows」の各ファイル名称を選択した時の イベントを取得して処理を行いたいのですが、どうすれば取得できるのでしょうか? Windows Tile Cascade ----------- Project_1   ←ここのイベントを取得したい Project_2   ←ここのイベントを取得したい afxres.h AFX_IDM_FIRST_MDICHILD いろいろと調べた結果上記のヘッダの「AFX_IDM_FIRST_MDICHILD 」がProject_1のIDとなっており、Project_2は+1したIDとなっております。 メッセージマップで ON_COMMAND(AFX_IDM_FIRST_MDICHILD,&CMainFrame::~~~~~ とすれば、とりあえずはイベントは取れるのですが、 正規の動作が予想のごとくできませんでした。 何か他の方法で、取得して、既存の処理を損なうことなく動作することは、 できるのでしょうか? 何か方法があればご教授御願い致します。

  • VCの多言語コンパイル方法

    あるソースをいじっています。リソースのMENUが多言語対応になっていて IDR_XXXというのが複数存在します。コンパイル時に、そのうちの1つ を指定するにはどうしたらいいのでしょうか。 アドバイスお願い致します。

  • error RC2104について

    いつもお世話になってます。 VS2005でC++を用いてWindowsアプリケーションを作成してます。 今までのリソーススクリプトに   MENUITEM "ヘルプ(&H)", IDM_HELP またヘッダースクリプトに   #define IDM_HELP 600 を追加したところ、以下のようなエラーが出ました。   error RC2104 : undefined keyword or key name: IDM_HELP ------------------------------ Webで調べていろいろ試してみたのですが改善されません。 ソースファイルに   #include <winuser.h> を追加したり、ヘッダーファイルに   #ifdef IDC_HELP   #undef IDC_HELP   #endif   #define IDC_HELP (-1) を追加してもだめでした。 まだまだ未熟な知識ですので、とても困っております。 ぜひご教授お願いいたします。

  • ~の初期化が 'case' ラベルによって行われませんでした。のエラーについて

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TaskTray.html を参考にタスクトレイアプリケーションを作りました。 下記コードにて、 case WM_LBUTTONDOWN://■追加 break;//■追加 を追加すると、error C2360: 'pPopup' の初期化が 'case' ラベルによって行われませんでした。のエラーが出ます。 どうしてなのでしょうか? お分かりの方お教えください。 ************************* LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if( message == WM_USER_POPUP ) { // カーソルの現在位置を取得 POINT point; ::GetCursorPos(&point); switch(lParam) { case WM_RBUTTONDOWN: SetForegroundWindow(); // この処理を忘れずに! CMenu menu; VERIFY(menu.LoadMenu(IDR_MENU1)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); PostMessage(WM_NULL); // この処理も忘れずに! break; case WM_LBUTTONDOWN://■追加 break;//■追加 } } return CFrameWnd::WindowProc(message, wParam, lParam); }

  • タイトルバーやメニューバーの高さ取得

    サイズ変更可能なダイアログ ボックスアプリケーションを作っています ダイアログサイズ変更時に GetClientRect( m_DlgSize ); のようにしてサイズを取得し、設定ファイルにm_DlgSizeを保存します 次回起動時にInitDialog()で SetWindowPos( NULL, 0, 0, m_DlgSize.Width(),m_DlgSize.Height() ,SWP_NOMOVE); のように復元しました。 幅はきちんと復元できたんですけど高さが小さくなってしまいます。 どうやらGetClientRectではメニューバーやタイトルバーの高さを含めない座標を返し、 SetWindowPosではそれらも含めてサイズを設定してしまうようです この差を埋めるためにメニューバーやタイトルバーの高さを取得する方法がわかりません。 何か良い方法があったらご教授願います。 環境はVC++6.0 MFCです。

  • 日英対応のメニューの作り方

    CでWindowsのプログラム作っています。 メニューの文字が現在、日本語で表示するようにプログラムしていますが、英語表示版が必要になりました。リソースファイルを書き換えて再コンパイルすれば英語版ができるのはわかりますが、もっとスマートな解決策ありませんか? たとえば、外部ファイルとして日本語、英語メニュー文字列を用意しておいて、起動時にどちらかを読み込んで、そこの文字列を表示するとか、日本語版、英語版のメニューをあらかじめプログラムに埋め込んでおいて、実行時のオプションメニューなどで表示を切り替えるなどです。 具体的なテクニックとそのためのコーディングお教えください。 なお、リソース・エディタは、「BCCForm and BCCSkelton」を使っています。

専門家に質問してみよう