掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ポップアップメニューについて (ID:68803)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
VS2005 SDKでダイアログベースのアプリを作成しています。 ダイアログ上を右クリックしたらポップアップウィンドウが出現し、 そのメニューを選ぶとタスクトレイに格納し、タスクトレイにあるアイコン を右クリックするとポップアップウィンドウが出現し、それを選らぶとまたダイアログ を出現する、ということをしたいのですが、詰まってしまいました。 タスクトレイからダイアログをふたたび出現させる際、ダイアログは再び元に戻るのですが その際、一緒にポップアップメニュー(hSubMenu1:ダイアログ上で出現する用のメニュー)が 出現します。それは出現したダイアログをマウスで動かすと何もせずに消えます。 さらにダイアログの×を押して閉じる際も同じポップアップメニューが出現します。 ダイアログが閉じて無くなってもそのポップアップメニューは消えずに残ったままになります。 そこでデバッガで追ったところ、どちらの際もダイアログプロージャ内のWM_RBUTTONUPメッセージを 拾っていることがわかりました。 ダイアログからタスクトレイには独自メッセージを定義してますので大丈夫なんですが、逆の時は ダイアログ側のメッセージ処理にかかってくるのでどうしたらよいか詰まってしまいました。 さらにダイアログを閉じる際がどうしてWM_RBUTTONUPを拾ってしまうのかわかりませんでした。 以上の点を聞きたいと思います。よろしくお願い致します。 // タスクトレイのマウスメッセージ #define WM_TASKTRAY (WM_APP + 1) // メイン int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { DialogBox( hCurInst, "OPTDLG", NULL, (DLGPROC)MyDlgProc ); return 0; } // ダイアログボックス LRESULT CALLBACK MyDlgProc( HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) { // 右クリ用 POINT pos; static HMENU hMenu, hSubMenu1, hSubMenu2; HINSTANCE hInst; // タスクトレイ static NOTIFYICONDATA nid; HICON hIcon; switch( msg ){ case WM_INITDIALOG: // もろもろを初期化 // ポップアップメニュー hMenu = LoadMenu( (HINSTANCE)GetWindowLong( hDlgWnd, GWL_HINSTANCE ), MAKEINTRESOURCE(IDR_MENU1) ); // サブメニューのハンドルを取得する hSubMenu1 = GetSubMenu( hMenu, 0 ); hMenu = LoadMenu( (HINSTANCE)GetWindowLong( hDlgWnd, GWL_HINSTANCE ), MAKEINTRESOURCE(IDR_MENU2) ); hSubMenu2 = GetSubMenu( hMenu, 0 ); // アイコン hIcon = LoadIcon((HINSTANCE)GetWindowLong( hDlgWnd, GWL_HINSTANCE ), MAKEINTRESOURCE(IDI_ICON1)); // タスクトレイ 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 = hIcon; nid.hIcon = hIcon; strcpy( nid.szTip, "tray" ); return TRUE; case WM_COMMAND: switch( LOWORD( wp ) ){ case IDCANCEL: EndDialog( hDlgWnd, IDCANCEL ); break; case ID_POPUPTASK: // タスクトレーに格納 Shell_NotifyIcon( NIM_ADD, &nid ); // タスクトレイへの登録 // メニューを破棄 DestroyMenu(hSubMenu1); hMenu = LoadMenu( (HINSTANCE)GetWindowLong( hDlgWnd, GWL_HINSTANCE ), MAKEINTRESOURCE(IDR_MENU2) ); hSubMenu2 = GetSubMenu( hMenu, 0 ); SetMenu( hDlgWnd, NULL ); // ウィンドウを消す ShowWindow( hDlgWnd, SW_HIDE ); UpdateWindow( hDlgWnd ); break; case ID_POPUP1END: // 終了 EndDialog( hDlgWnd, 0 ); break; case ID_RETURN: // 元に戻す // ウィンドウを元に戻す ShowWindow( hDlgWnd, SW_SHOWNORMAL ); SetMenu( hDlgWnd, hSubMenu1 ); Shell_NotifyIcon( NIM_DELETE, &nid ); // メニューを破棄 DestroyMenu(hSubMenu2); hMenu = LoadMenu( (HINSTANCE)GetWindowLong( hDlgWnd, GWL_HINSTANCE ), MAKEINTRESOURCE(IDR_MENU1) ); // サブメニューのハンドルを取得する hSubMenu1 = GetSubMenu( hMenu, 0 ); UpdateWindow( hDlgWnd ); break; case ID_POPUP2END: // 終了 EndDialog( hDlgWnd, 0 ); break; default: return FALSE; case WM_RBUTTONDOWN: //右クリック // カーソルの座標を取得 pos.x = LOWORD( lp ); pos.y = HIWORD( lp ); // 取得したカーソル位置をスクリーン座標に変換する ClientToScreen( hDlgWnd, &pos ); SetForegroundWindow( hDlgWnd ); // ポップアップメニューを表示 kari = TrackPopupMenu( hSubMenu1, TPM_LEFTALIGN, pos.x, pos.y, 0, hDlgWnd, NULL ); return FALSE; 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 ); // ウィンドウを元に戻す //ShowWindow( hDlgWnd, SW_SHOWNORMAL ); break; } break; default: return FALSE; } }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.