トップページ > 記事閲覧
ウィンドウのアクティブ状態について
名前:てきやく 日時: 2016/07/22 05:14

https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3759 こちらのトピックを見ながら、ウィンドウサイズ変更時などにもリアルタイムに描画するものを作っています。 フォーカスが他のウィンドウに移った時はポーズ、ウィンドウの移動やサイズ変更時などは続行という処理をしたいのですが、GetWindowActiveFlag関数ではそれらの区別ができません。 「ウィンドウが最前面かどうかを取得」または「ウィンドウにフォーカスがあるかどうかを取得」のような関数があれば実現できると思うのですが、実装していただくことは可能ですか? それとも、通常SetAlwaysRunFlagをTRUEにしてもウィンドウの移動中などは処理が止まってしまうように、DXライブラリの範疇外のことなのでしょうか……。 以下、現状のソースコードです。 #include "DxLib.h" volatile bool EndFlag; volatile bool EndCompFlag; // 描画処理スレッド用関数 DWORD WINAPI DrawThread(LPVOID) { int WindowW, WindowH; bool ActiveFlag, lastActive; bool Pause = false; lastActive = true; // EndFlagが立つまでループ while (!EndFlag && ScreenFlip() == 0 && ClearDrawScreen() == 0) { // ウインドウのクライアント領域を取得する GetWindowSize(&WindowW, &WindowH); // アクティブ状態を取得 ActiveFlag = (GetWindowActiveFlag() == TRUE); clsDx(); printfDx("%s\n" ,(ActiveFlag)? "アクティブ": "非アクティブ"); if (ActiveFlag) { // 右クリックでポーズ解除 if ((GetMouseInput() & MOUSE_INPUT_RIGHT) != 0)Pause = false; } else if (lastActive) { // 非アクティブ状態になったらポーズ Pause = true; } lastActive = ActiveFlag; // 描画 if (!Pause) { DrawBox(20, 20, WindowW - 20, WindowH - 20, GetColor(255, 255, 255), FALSE); } else { // ポーズ画面のつもり DrawBox(20, 20, WindowW - 20, WindowH - 20, GetColor(255, 255, 255), TRUE); } } // EndCompFlagを立てる EndCompFlag = true; return 0; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { HANDLE ThreadHandle; DWORD ThreadID; int DesktopW, DesktopH; ChangeWindowMode(TRUE); // ウィンドウモード GetDefaultState(&DesktopW, &DesktopH, NULL); // 画面サイズを取得 SetGraphMode(DesktopW, DesktopH, 32); // 描画可能領域の大きさを画面サイズに合わせる SetWindowStyleMode(10); // 枠を細くし、最大化ボタンを有効にする SetAlwaysRunFlag(TRUE); // 非アクティブ状態でも動作する SetWindowSizeChangeEnableFlag(TRUE, FALSE); // ウィンドウサイズの動的変更 SetWindowSize(960, 600); // ウィンドウの初期サイズを設定 SetUseDxLibWM_PAINTProcess(FALSE); // DXライブラリでWM_PAINTの処理をしない if (DxLib_Init() == -1)return -1; SetDrawScreen(DX_SCREEN_BACK); // 描画用スレッドを起動 ThreadHandle = CreateThread(NULL, 0, DrawThread, 0, 0, &ThreadID); // メインループ while (ProcessMessage() == 0 && !EndCompFlag) Sleep(16); // EndFlagを立てる EndFlag = true; // EndCompFlagが立つまで待つ while (!EndCompFlag) Sleep(16); DxLib_End(); // DXライブラリ終了処理 return 0; }
メンテ

Page: 1 |

Re: ウィンドウのアクティブ状態について ( No.1 )
名前:てきやく 日時:2016/07/22 05:29

すみません、自己解決しました。 ActiveFlag = (GetActiveFlag() == TRUE); ↑この一行を ActiveFlag = (GetMainWindowHandle() == GetForegroundWindow()); ↑このように変更しました
メンテ
Re: ウィンドウのアクティブ状態について ( No.2 )
名前:てきやく(解決) 日時:2016/07/22 05:30

解決のつけ忘れです。度々すみません
メンテ

Page: 1 |

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

   クッキー保存