DXライブラリはデフォルトではメインウインドウが非アクティブになった際に
ライブラリ内部の様々な箇所に仕掛けてある「アクティブになるまで処理を止める」プログラムで
メインウインドウがアクティブになるまでそこで処理が止まるようになっています
( ProcessMessage も非アクティブなら処理を止める関数の内の一つです )
その機能をOFFにするための関数が SetAlwaysRunFlag で、この関数に TRUE を
渡して呼び出すことでメインウインドウが非アクティブでも処理を止めることなく
動作させることができます
なので、恐らく sy(サイ)さんがされようとお考えの処理は予め SetAlwaysRunFlag に
TRUE を渡して実行し、非アクティブ時でも処理を止めないようにした上で
GetActiveFlag の戻り値を監視して FALSE になった際に処理とBGMを止める、
ということをすることで実現できると思います
若しくは、ウインドウのアクティブ状態が変化したときに呼ばれるコールバック関数を登録する
SetActiveStateChangeCallBackFunction という非公開関数を使用する方法もあります
// ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数をセットする( CallBackFunction に NULL を渡すと設定をリセットできる )
int SetActiveStateChangeCallBackFunction( int (* CallBackFunction )( int ActiveState , void *UserData ) , void *UserData ) ;
第一引数にアクティブ状態が変化したときに呼ばれる関数を、
第二引数にコールバック関数の第二引数として渡す void 型のアドレスを渡します。
( 第二引数は特に必要が無い場合はNULL で大丈夫です )
コールバック関数は第一引数に変化後のアクティブ状態( TRUE:アクティブ FALSE:非アクティブ )を、
第二引数に void 型のアドレスを持つものである必要があります
この関数を使用してウインドウがアクティブになる度にグローバル変数の値を
インクリメントするサンプルプログラムを組んでみましたので、よろしければ
ご覧になってみてください
#include "DxLib.h"
int ActiveCount = 0 ;
// ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数
int ActiveStateChange( int ActiveState, void *UserData )
{
// アクティブに変化した場合にカウントする
if( ActiveState != FALSE )
{
ActiveCount ++ ;
}
// 終了
return 0 ;
}
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
return -1 ;
// ウインドウのアクティブ状態に変化があったときに呼ばれるコールバック関数をセットする( NULL をセットすると呼ばれなくなる )
SetActiveStateChangeCallBackFunction( ActiveStateChange, NULL ) ;
// 描画先画面を裏にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// ループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面を初期化
ClsDrawScreen() ;
// 文字列の描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "ActiveCount:%d", ActiveCount ) ;
// 表画面と裏画面を取り替えます
ScreenFlip() ;
}
// DXライブラリ使用の終了処理
DxLib_End() ;
// ソフトの終了
return 0 ;
}
コールバック関数内で ActiveState が FALSE になった際にBGMを止める
という処理を加えれば sy(サイ)さんの意図する処理を実現することができると思います
ただ、このサンプルプログラムを実行して分かったのですが、現在のバージョンでは
非アクティブになった際にコールバック関数が2回呼ばれるようになってしまっていました
修正版をアップしましたので、もし SetActiveStateChangeCallBackFunction をお使いに
なられる際はこちらの修正バージョンをお使いください m(_ _;m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)