トップページ > 記事閲覧
タスクトレイの処理
名前:108EAA0A 日時: 2017/11/06 00:45

いつもお世話になっております。 現在2点ほど解決方法が思い浮かばなかったものがあるため、相談させていただきました。 1つ目は、ウィンドウ内を右クリックするとコンテキストメニューを表示する機構 2つ目は、タスクトレイにアイコンを追加、それを右クリックしてコンテキストメニューを表示、その中から設定や終了を選択する機構 2つ目については見えないウィンドウを作成し自前のメッセージ処理の中で処理をすればいいのかと思ったのですが、Win32APIを大して叩いた覚えがないのでこれであってるのかわからず、質問させて頂いた次第です。 一応調べはしたのですが、調べ方が悪いのか求める情報が見当たらなかったためご教授お願いします。 C++ライクな方法でも大丈夫です。
メンテ

Page: 1 |

Re: タスクトレイの処理 ( No.1 )
名前:管理人 日時:2017/11/08 00:57

> 1つ目は、ウィンドウ内を右クリックするとコンテキストメニューを表示する機構 一般的なソフトのウィンドウの上部に存在するメニューと同じような処理で実装できるようです 有名なウェブサイト『猫でもわかるプログラミング』に解説がありましたので、よろしければご覧になってみてください ( 因みにDXライブラリには右クリックで表示するメニュー用の機能は無いので、こちらも Win32API を使用して 自前で実装していただく必要があります m(_ _;m ) <猫でもわかるプログラミング Windows SDK編 第1部 第44章 右クリックで出てくるメニュー> http://www.kumei.ne.jp/c_lang/sdk/sdk_44.htm ただ、書いてあることを理解するには Win32API の基礎的な知識が必要です その Win32API の基礎的なことについても『猫でもわかるプログラミング』で解説されていますので、 必要に応じて44章以前の章を参照してください <猫でもわかるプログラミング> http://www.kumei.ne.jp/c_lang/ 尚、DXライブラリで自前で作成したウインドウを使用する場合は SetUserWindow を使用します // DXライブラリで使用するウインドウのハンドルをセットする( DxLib_Init を実行する以前でのみ有効 ) int SetUserWindow( HWND WindowHandle ) ; 『猫でもわかるプログラミング』のサンプルプログラムを元に SetUserWindow を使用して自前で用意した ウインドウを使用するプログラムを組んでみましたので、よろしければご覧ください m(_ _)m #include "DxLib.h" LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; char szClassNme[] = "ウィンドウクラス・ネーム"; int QuitMessageFlag = FALSE ; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { // ウインドウの作成 HWND hWnd; MSG msg; WNDCLASS myProg; if (!hPreInst) { myProg.style =CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc =WndProc; myProg.cbClsExtra =0; myProg.cbWndExtra =0; myProg.hInstance =hInstance; myProg.hIcon =NULL; myProg.hCursor =LoadCursor(NULL, IDC_ARROW); myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); myProg.lpszMenuName =NULL; myProg.lpszClassName =szClassNme; if (!RegisterClass(&myProg)) return FALSE; } hWnd = CreateWindow(szClassNme, "テストプログラム", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 作成したウインドウをセット SetUserWindow( hWnd ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; // メッセージループ while( ProcessMessage() == 0 && QuitMessageFlag == FALSE ) { // メッセージがあったら処理する if( PeekMessage( &msg, hWnd, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ) ; DispatchMessage( &msg ) ; } // ウインドウに四角形を描画する ClearDrawScreen() ; DrawBox( 100, 100, 200, 200, GetColor( 255,255,255 ), TRUE ) ; ScreenFlip() ; } // DXライブラリの後始末 DxLib_End(); return (msg.wParam); } // メッセージ処理用関数 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: QuitMessageFlag = TRUE ; PostQuitMessage(0); break; default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } return (0L); } > 2つ目は、タスクトレイにアイコンを追加、それを右クリックしてコンテキストメニューを表示、その中から設定や終了を選択する機構 こちらも『猫でもわかるプログラミング』に解説がありました <猫でもわかるプログラミング Windows SDK編 第3部 第254章 タスクトレーに格納する> http://www.kumei.ne.jp/c_lang/sdk3/sdk_254.htm > 2つ目については見えないウィンドウを作成し自前のメッセージ処理の中で処理をすればいいのかと思ったのですが、Win32APIを大して叩いた覚えがないのでこれであってるのかわからず、質問させて頂いた次第です。 『猫でもわかるプログラミング』の解説でも 「タスクトレーに格納といっても、 実際はタスクトレーにアイコンを表示して、ウィンドウを見えなくしているだけです。 こうすることによってユーザーはウィンドウが小さくなって、タスクトレーに格納されたような 錯覚に陥ります。」 と解説されていますので、108EAA0Aさんの考えている方法で問題ないと思います
メンテ
Re: タスクトレイの処理 ( No.2 )
名前:108EAA0A(解決) 日時:2017/11/09 13:29

ありがとうございますm(_ _)m このサイトを読んでやってみようと思います
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存