掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ポップアップメニューについて (ID:68806)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> さらにダイアログを閉じる際がどうしてWM_RBUTTONUPを拾ってしまうのかわかりませんでした。 ダイアログを閉じるときに右上の[×]ボタンをマウスでクリックしますよね。 だからこのクリック時にWM_RBUTTONDOWN、WM_RBUTTONUPが発生するので問題ないはずです。 逆にWM_RBUTTONUPが発生しないとクリックを検出できなくなるよ。 ソースを見ましたがこれだけでは良く分かりません。 メニューとダイアログのリソースも必要な部分だけでいいので貼り付けたら分かるかも。 気になった点。 > LRESULT CALLBACK MyDlgProc( HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) 戻り値は BOOL でしょ。ダイアログだから。 あと無駄に LoadMenu、DestroyMenu、SetMenu、GetSubMenu などが使われているね。 自分なら WM_INITDIALOG 内で LoadMenu、WM_CLOSE 内で DestroyMenu と書く。 そのほか IDCANCEL、ID_POPUP1END、ID_POPUP2END も一箇所(WM_CLOSE)に書く。 下にサンプルを載せておく。 BOOL CALLBACK MyDlgProc( HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp ) { static HMENU hMenu, hSubMenu1, hSubMenu2; static NOTIFYICONDATA nid; switch ( msg ){ case WM_INITDIALOG: { HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hDlgWnd,GWL_HINSTANCE); // ポップアップメニュー hMenu = LoadMenu( hInstance, MAKEINTRESOURCE(IDR_POPUPMENU) ); hSubMenu1 = GetSubMenu( hMenu, 0 ); // IDR_MENU1 hSubMenu2 = GetSubMenu( hMenu, 1 ); // IDR_MENU2 // タスクトレイ nid.cbSize = sizeof(nid); nid.hWnd = hDlgWnd; nid.uID = IDI_ICON1; nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.uCallbackMessage = WM_TASKTRAY; nid.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON1) ); lstrcpy( nid.szTip, TEXT("tray") ); break; } case WM_CLOSE: DestroyMenu( hMenu ); EndDialog( hDlgWnd, wp ); // 返したい値をwpで受け取る case WM_COMMAND: switch ( LOWORD(wp) ){ // タスクトレーに格納 case ID_POPUPTASK: Shell_NotifyIcon( NIM_ADD, &nid ); ShowWindow( hDlgWnd, SW_HIDE ); break; // 元に戻す case ID_RETURN: ShowWindow( hDlgWnd, SW_SHOW ); Shell_NotifyIcon( NIM_DELETE, &nid ); break; case ID_POPUP1END: PostMessage( hDlgWnd, WM_CLOSE, IDCANCEL, 0 ); case ID_POPUP2END: PostMessage( hDlgWnd, WM_CLOSE, 0, 0 ); case IDCANCEL: PostMessage( hDlgWnd, WM_CLOSE, 0, 0 ); default: return FALSE; } break; // 右クリック case WM_RBUTTONDOWN: { POINT pos; GetCursorPos( &pos ); TrackPopupMenu( hSubMenu1, TPM_LEFTALIGN, pos.x, pos.y, 0, hDlgWnd, NULL ); } // タスクトレイ時に case WM_TASKTRAY: switch ( lp ){ case WM_RBUTTONDOWN: GetCursorPos( &pos ); SetForegroundWindow( hDlgWnd ); TrackPopupMenu( hSubMenu2, TPM_RIGHTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hDlgWnd, NULL ); break; } default:return FALSE; } return TRUE; } // リソースは分けていたIDR_MENU1、IDR_MENU2を共通に書く IDR_POPUPMENU MENU BEGIN POPUP "IDR_MENU1のメニュー" BEGIN MENUITEM "タスクトレイに格納", ID_POPUPTASK MENUITEM "終了", ID_POPUP1END END POPUP "IDR_MENU2のメニュー" BEGIN MENUITEM "タスクトレイから出す", ID_RETURN MENUITEM "終了", ID_POPUP2END END END 不要と思われる SetMenu、UpdateWindow、ClientToScreen、SetForegroundWindow を 取り除き WM_COMMAND メッセージをスッキリさせてみた。 これで動作の確認をしてみて下さい。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.