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;
これではうまくいかないのでご助言お願いします。
No.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)
このようになります。
・以上。
No.4
- 回答日時:
★補足要求します。
>「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
No.3
- 回答日時:
★リソースを見ました。
・やっぱり指定方法が間違っています。
それもリソースとソースの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が定義されていません。」と出るのですがどうしたらいいのでしょうか。お願いします。
No.2
- 回答日時:
★1つ疑問が…。
>hMenu = LoadMenu(hInst,"MENUDATA");
↑
この行の『MENUDATA』は文字列で良いのですか?
記号定数の『MENUDATA』だと文字列で指定するとメニューは表示されず、
文字列での『MENUDATA』だと記号定数で指定してもメニューは表示されません。
ここに注意。
・以上。確認を。
この回答への補足
リソースファイルのMenuから呼び出すようにしたのですが・・・。
//リソース//Script1.rc
//
// Menu
//
MENUDATA MENU DISCARDABLE
BEGIN
MENUITEM "終了", 65535
END
No.1
- 回答日時:
★お聞きしたい事が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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) RANK.EQとCOUNTIFSの組み合わせで同ポイントの場合、違う条件を加えて順位を付けたい。 1 2022/08/30 19:49
- その他(Microsoft Office) Microsoft Edgeの「ニュースと関心事項」についてお聞きします。 3 2023/05/22 12:08
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- 英語 "by a ~ 0.5 percentage point"が単数となる理由等について 2 2023/05/11 10:41
- スーパー・コンビニ イオンカードで、レジでWAON POINTを使って支払いたい時、電子マネーWAONカードのように機械 1 2023/03/12 05:44
- ポイントサービス・マイル docomoポイントについてです。 今まで9000pointあったのが いきなり120pointにな 6 2022/07/01 10:59
- その他(IT・Webサービス) どうすればgoogleのポップアップの表示が消えますか? 3 2022/09/11 14:04
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- デスクトップパソコン PC作成のスマート対応フアイルへの転換 1 2022/06/18 19:50
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダイアログの上のテキストボッ...
-
フォーム上のリストボックスに...
-
ボタンの表示の色、フォントを...
-
メッセージボックスを大きくす...
-
【VC++2005(CLR)】ダイアログ右...
-
タスクバーのメニュー表示
-
コンボボックスのドロップダウ...
-
ダイアログ最前面表示時の後ろ...
-
Visual C++のダイアログ編集画...
-
MFCダイアログボックスを最前面...
-
【VC++2005】ダイアログサイズ...
-
MFC ポップアップメニューのチ...
-
confirmダイアログの表示文字に...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
c言語でキーボードから2点の座...
-
コントロールの書式設定で、“コ...
-
ドロップダウンリストのフォン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスを大きくす...
-
ボタンの表示の色、フォントを...
-
コンボボックスのドロップダウ...
-
フォーム上のリストボックスに...
-
ダイアログボックスで指定した...
-
C# ボタンコントロール内で文字...
-
ダイアログの上のテキストボッ...
-
confirmダイアログの表示文字に...
-
'int' から 'LPCSTR' に変換で...
-
MFCダイアログボックスを最前面...
-
メッセージボックスのボタン文...
-
vbscriptで、ファイル選択ダイ...
-
ボタンの配置を変更したい
-
ダイアログにプレビュー表示
-
リソースファイルとは・・・
-
エクセル VBA 「Sub Auto_Open(...
-
ダイアログの表示位置の保存
-
VC(Ver6.0)でダイアログサイズ...
-
ダイアログの一部を半透明化す...
-
MFC ポップアップメニューのチ...
おすすめ情報