ポップアップメニューの作り方とは?
- NotifyIconでタスクバーに呼び出したアイコンの上で右クリックするとポップアップメニューが表示されるようにしたい。
- ポップアップメニューの作り方が分からず困っています。
- 環境はMicrosoft Visual C++ SDKを使用しています。
- ベストアンサー
ポップアップメニュー
NotifyIconでタスクバーに呼び出したアイコンの上で右クリックをしたら、ポップアップメニューが表示させるように作りたいのですが、作り方が分かりません。(サイトなどを見たりしました。) 出きれば教えて頂きたいと思います。 *何をしたいのか↓ タスクトレイで表示されたアイコンを右クリックをするとポップアップメニューが出る。 ・環境 Microsoft Visual C++ SDK HINSTANCE hInst; POINT point; static HMENU hMenu,hSubMenu; /////////////////省略/////////////////// case WM_RBUTTONDOWN: hMenu = LoadMenu(hInst,"MENUDATA"); hSubMenu = GetSubMenu(hMenu,0); point.x = LOWORD(lParam); point.y = LOWORD(lParam); TrackPopupMenu(hSubMenu,TPM_LEFTALIGN,point.x,point.y,0,hWnd,NULL); break; これではうまくいかないのでご助言お願いします。
- skyforce
- お礼率78% (33/42)
- C・C++・C#
- 回答数5
- ありがとう数3
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
★最後のアドバイス >アイコンの左上にメニューが正確に表示させるにはどうしたらいいのでしょうか。お願いします。例えを出しておきます。 ↑ 最初にタスクバーの位置が『下』に必ずあるとします。 この状態では『タスクトレイ』が右側にあるのでショートカット・メニューを出すときに 『TPM_RIGHTALIGN』と『TPM_BOTTOMALIGN』の定数をしています。 これで TrackPopupMenu() で指定した座標がメニューの右下となります。 サンプル: point.x = LOWORD( lParam ); point.y = LOWORD( lParam ); TrackPopupMenu( hSubMenu, (TPM_RIGHTALIGN | TPM_BOTTOMALIGN), point.x, point.y, 0, hWnd, NULL ); その他: ・タスクバーの位置が『上』『左』『右』にも対応するには次のようになります。 方法は (1)タスクバーの位置を取得 (2)タスクバーの位置から TrackPopupMenu() に渡す定数を分岐 これで出来ると思います。 なお、 上側…(TPM_RIGHTALIGN | TPM_TOPALIGN) 下側…(TPM_RIGHTALIGN | TPM_BOTTOMALIGN) ←下側:限定ならこれ 左側…(TPM_LEFTALIGN ~ TPM_BOTTOMALIGN) 右側…(TPM_RIGHTALIGN | TPM_BOTTOMALIGN) このようになります。 ・以上。
その他の回答 (4)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★補足要求します。 >「MENUDATAが定義されていません。」と出るのですがどうしたらいいのでしょうか。お願いします。 ↑ 『MENUDATA』という記号定数が定義されていません。 >・環境 >Microsoft Visual C++ SDK ↑ コンパイラは無料版ですか? 有料版ならばリソース・エディタが付属しているためリソースを作成すると XXXXX.rc と resource.h というヘッダが自動的に作成されます。この『resource.h』にはリソースで 使用している記号定数(コントロールのIDやメニューのIDなど)が定義されます。 ・さてと skyforce さんはどのようにしてリソースを作っていますか? もし、フリーソフト等を使ってリソースを作成している場合は、そのソフトがメニューのIDを 記号定数で定義するのか、文字列で定義するのかを確認して下さい。そうしないと先に進みません。 ちなみに回答 No.2 の補足にあるリソースを見る限りでは記号定数でメニューIDを定義しています。 記号定数なら『resource.h』ヘッダなどのファイルに『#define MENUDATA (数)』と1行追加します。 (数)は重複しない整数値を指定します。自由です。 ・あと質問にある『hMenu = LoadMenu(hInst,"MENUDATA");』が正しい記述ならばリソースの記述が 間違っていることになります。この場合はリソースを次のように修正して下さい。 間違い⇒『MENUDATA MENU DISCARDABLE 』 正しい⇒『"MENUDATA" MENU DISCARDABLE 』 ・どちらが正しいのか判断して下さい。 判断の基準はメニューのIDを記号定数で指定するのか、文字列定数で指定するのかを先に決めます。 あなたはどのようにメニューIDを指定しているのですか? ハッキリして下さい。 ここをハッキリとしないと問題は一生解決しません。 ・それでは補足にどうぞ。あと回答 No.2 も読み直して下さい。
お礼
>間違っていることになります。この場合はリソースを次のように修正 >して下さい。 >間違い⇒『MENUDATA MENU DISCARDABLE 』 >正しい⇒『"MENUDATA" MENU DISCARDABLE 』 IDの指定されてた所がおかしかったみたいです。 リソースのID:["MENUDATA"]をID:[MENUDATA]にしたところうまくいきました。 ありがとうございます。 最後にタスクトレイのアイコンをクリックしたときに アイコンの左上にメニューが正確に表示させるにはどうしたらいいのでしょうか。お願いします。例えを出しておきます。 http://www.geocities.jp/wingcold2236/001.html
- Oh-Orange
- ベストアンサー率63% (854/1345)
★リソースを見ました。 ・やっぱり指定方法が間違っています。 それもリソースとソースの2つがそれぞれ違います。 次のようにして下さい。 ●ソースコード hMenu = LoadMenu( hInst, MAKEINTRESOURCE(MENUDATA) ); ※リソースで『MENUDATA』という記号定数を使っているので MAKEINTRESOURCE() マクロを使います。 ●リソース部分 MENUDATA MENU DISCARDABLE BEGIN POPUP "" BEGIN MENUITEM "終了", 65535 END END ※ショートカットメニューの場合は POPUP 内のBEGIN~ENDに記述します。 ●上記よりメニューの出し方をまとめると hMenu = LoadMenu( hInst, MAKEINTRESOURCE(MENUDATA) ); hSubMenu = GetSubMenu( hMenu, 0 ); point.x = LOWORD( lParam ); point.y = LOWORD( lParam ); TrackPopupMenu( hSubMenu, TPM_LEFTALIGN, point.x, point.y, 0, hWnd, NULL ); となります。 これでショートカットメニューが出ます。 今後、ショートカットメニューのリソースの記述に注意して下さい。
補足
返事が遅くなってしまい申し訳ございません。 「MENUDATAが定義されていません。」と出るのですがどうしたらいいのでしょうか。お願いします。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★1つ疑問が…。 >hMenu = LoadMenu(hInst,"MENUDATA"); ↑ この行の『MENUDATA』は文字列で良いのですか? 記号定数の『MENUDATA』だと文字列で指定するとメニューは表示されず、 文字列での『MENUDATA』だと記号定数で指定してもメニューは表示されません。 ここに注意。 ・以上。確認を。
補足
リソースファイルのMenuから呼び出すようにしたのですが・・・。 //リソース//Script1.rc // // Menu // MENUDATA MENU DISCARDABLE BEGIN MENUITEM "終了", 65535 END
- Oh-Orange
- ベストアンサー率63% (854/1345)
★お聞きしたい事が1つ。 ・Shell_NotifyIcon() 関数でタスクトレイにアイコンを登録するとき uCallbackMessage はちゃんと設定していますか? 通知するメッセージのIDコードですよ。 ・仮に uCallbackMessage=WM_TASKTRAY という定数をセットしていたとします。 この場合はウインドウ・プロシージャ関数で次のようにします。 サンプル: LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ){ case WM_TASKTRAY: // ユーザ定義のメッセージ処理 if ( wParam == ID_TRAYICON ){ // アイコンの識別コード switch ( lParam ){ case WM_RBUTTONDOWN: /* ここにショートカット・メニューを出す処理 */ break; } } break; default:return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; } 以上。
補足
回答ありがとうございます。 nid.uCallbackMessageは nid.uCallbackMessage = MYTRAY_MESSAGE; とつけております。 switch (msg) { case MYTRAY_MESSAGE: if(wParam == ID_MYTRAY){ switch(lParam){ case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: hMenu = LoadMenu(hInst,"MENUDATA"); hSubMenu = GetSubMenu(hMenu,0); point.x = LOWORD(lParam); point.y = LOWORD(lParam); TrackPopupMenu(hSubMenu,TPM_LEFTALIGN,point.x,point.y,0,hWnd,NULL); break; ///////////////以下省略////////////// というような感じです。
関連するQ&A
- MFC ポップアップメニューのチェック表示について
はじめまして。 質問させてください。 VC 2005 MFC を使用して開発しております。 ダイアログベースです。 ポップアップメニューのアイテムをクリックされたら チェックマークをON OFFしたいのですが、現状うまくいきません。 [現在の方法] //右クリックで表示 void CAnalogClockDlg::OnRButtonDown(UINT nFlags, CPoint point) { CMenu menu; VERIFY(menu.LoadMenu(IDR_MENU)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); ClientToScreen(&point); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd()); CDialog::OnRButtonDown(nFlags, point); } //項目の有効無効時 void CAnalogClockDlg::OnUpdatePopupFore(CCmdUI *pCmdUI) { pCmdUI->SetCheck(false); pCmdUI->SetText(_T("test")); } リソースメニューで [checked] = trueにして 初回表示はチェックありになっているのですが、 pCmdUI->SetCheck(false); の処理で変更されません。 ちなみにキャプションを変更できません。 何か根本的に間違っているのでしょうか? 詳しい方がおりましたら ご教授お願いいたします。
- ベストアンサー
- C・C++・C#
- メニューにアイコンを付加するには?
Windows APIでプログラミングしています。右クリックが起きた時にLoadMenuでリソースからメニューを取り出し、TrackPopupMenuでポップアップメニューを表示するようにしています。 このメニューの項目の右横にアイコンを付けたいのですが、どうすればよいのでしょうか? また、項目の文字を太字にする方法も分かれば教えてください。
- ベストアンサー
- C・C++・C#
- タスクトレイのポップアップメニュー
こんにちわ。 タスクトレイにアイコンを登録し、右クリックでポップアップメニューを表示しています。 そのポップアップを表示している状態でデスクトップを左クリックしてもメニューが消えないのはなぜでしょうか?ポップアップされたメニューをクリックしないとメニューが消えてくれません。 何かのイベントでメニューを消す処理をいれておくのでしょうか? どなたか宜しくお願いします。 (VB6 SP5で作成しました。)
- ベストアンサー
- Visual Basic
- ポップアップメニュー
ポップアップメニューについて質問させて頂きます。 リストビュー上で右クリックしたときにポップアップメニューを表示させているのですが、このポップアップメニューの項目がクリックされた時のイベントの取り方が分かりません。 ご存知の方、宜しくお願いします。 環境はVisual Studio6.0 Windows2000です
- 締切済み
- C・C++・C#
- ポップアップメニューがおかしいです。
ポップアップメニューや右クリックメニューが透明に表示されています。見にくくてしょうがありません。だれか助けてください。。。。
- ベストアンサー
- その他(インターネット・Webサービス)
- ウィンドウ非表示に時に表示したポップアップメニューを閉じるには?
質問させて頂きます。 現在C++にてWin32SDKを使用し開発を行っております そこで、メインウィンドウが非表示の時にポップアップメニューを表示するようにしているのですが 非表示の際、ホットキーを起因にポップアップメニューを表示すると ポップアップメニュー以外をクリックしても消えますが WM_TIMER等、一定時間経過時に表示した場合 ポップアップメニュー以外をクリックしても消えません 下記が一部コードを抜粋した物です case WM_CREATE: hMenu = CreatePopupMenu( ); AppendMenu( hMenu, MF_STRING, 0x01, TEXT("HOGE1") ); AppendMenu( hMenu, MF_STRING, 0x02, TEXT("HOGE2") ); return 0; case WM_HOTKEY: GetCursorPos( &pos ); SetForegroundWindow( hWnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); return 0; case WM_TIMER: GetCursorPos( &pos ); SetForegroundWindow( hWnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); return 0; ホットキーの設定と、タイマーの設定の処理を付随しておりませんが ホットキー、タイマーの処理は同じものです ポップアップメニューを表示の際、WM_INITMENUPOPUPからポップアップメニューをサブクラス化し WM_KILLFOCUS等のメッセージが来た際に破棄する処理を試しても上手く行きません この場合、マウスをグローバルフックしなければならないでしょうか? 極力フックは避けて解決したいと思っております。 ご教授の程よろしくお願いします。
- 締切済み
- C・C++・C#
- autohotkeyのポップアップメニューについて
autohotkeyを以下環境で使用しています。 OS: Windows7 64bit autohotkey: Ver 1.0.48.05 やりたい事: 通知領域にあるautohotkeyアイコンを右クリックして、 ポップアップメニューから"Reload This Script"を選びたい (添付画像を参照してください) 以下のようにスクリプトを組みました Ctrl+Alt+vにて起動 autohotkeyアイコンは、座標(1000, 800)にあるとします。 ^!v:: MouseClick, RIGHT, 1000, 800, , 5 Sleep, 1000 Send, r return 実行すると右クリックのポップアップメニューまでは表示されるのですが、 "Send, r"が実行されず、"Reload This Script"が選べません。 ※この状態で、手動で"r"キーを押すと、きちんと"Reload This Script"が実行されます 通知領域アイコンを右クリックして出てくるポップアップメニューにコマンドを通すのは、 "Send, r"ではなくて特別なコマンドが必要なのでしょうか? 以上、よろしくお願いいたします。
- ベストアンサー
- その他(ソフトウェア)
- ~の初期化が '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); }
- ベストアンサー
- C・C++・C#
- 押されたキーにてポップアップメニューを切り替える
OS:XP SP2 アプリ:Excel 2002 ワークシート上で右クリックにてポップアップメニューが表示されますが、Ctrl+右クリック、Shirf+右クリック、Alt+右クリックにて、独自のポップアップメニューを表示させようてしています。 プロジェクトにクラスモジュールを追加し下記の様に宣言しています。 Private WithEvents App As Application Private Sub Class_Initialize() Set App = Application End Sub 右クリックイベント内で現在押されているキーを判断することはできないでしょうか? Private Sub App_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) ここで押されたキーにて表示するメニューを切り替える End Sub 独自のポップアップメニューの追加/表示はできています。 ご教授のほど宜しくお願いします。
- ベストアンサー
- Visual Basic
- WM_TIMERからポップアップメニューを閉じるには?
質問させて頂きます。 現在C++にてWin32SDKを使用し開発を行っております そこで、メインウィンドウが非表示の時にもポップアップメニューを表示するようにしているのですが 非表示の際、ホットキーからポップアップメニューを表示すると ポップアップメニュー以外をクリックしても消えますが WM_TIMER等、一定時間経過時に表示した場合 ポップアップメニュー以外をクリックしても消えません WM_HOTKEYでは SetForegroundWindow関数でアクティブにした後に TrackPopupMenu関数でポップアップメニューを表示して 関係ない所をクリックされてもうまく消えます WM_TIMERでもWM_HOTKEYと同じ処理をしても上手くいきません タスクトレイの右クリックと同じく TrackPopupMenu関数の後にWM_NULLをポストしてもメニューは消えません 何か上手く解決出来る方法は無いでしょうか? どうぞよろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
うまくいきました。 ありがとうございます。