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;
}