Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.1 ) |
- 名前:管理人 日時:2022/03/14 02:17
すみません、C++の標準ライブラリの機能を使用すると、libファイルのバージョン間の互換性が
現在よりも低くなり、用意しなければならない libファイルの量が増大してしまうので、
こちらのような static なメンバー関数を介す方法でメンバー関数を呼ぶようにしてください m(_ _;m
class CallbackTest
{
public:
CallbackTest() : Loaded( false ) {}
// 読み込み完了フラグ
bool Loaded ;
// コールバックで呼びたいメンバー関数
void CallbackFunction( int Handle )
{
// 読み込み完了フラグを立てる
Loaded = true ;
}
// SetASyncLoadFinishCallback に登録するコールバック関数
static void CallbackFunctionStatic( int Handle, void *Data )
{
// コールバックで呼びたいメンバー関数を呼ぶ
( ( CallbackTest * )Data )->CallbackFunction( Handle ) ;
}
} ;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GrHandle ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 非同期読み込みON
SetUseASyncLoadFlag( TRUE ) ;
// 画像を非同期読み込み
GrHandle = LoadGraph( "Test1.bmp" ) ;
// 画像の非同期読み込みが終わったら呼ばれるコールバック関数を設定する
CallbackTest ctest ;
SetASyncLoadFinishCallback( GrHandle, CallbackTest::CallbackFunctionStatic, &ctest ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen() ;
// 読み込み状況を描画
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Loaded : %s", ctest.Loaded ? "true" : "false" ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
|
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.2 ) |
- 名前:通りすがり 日時:2022/03/15 17:15
ほぼ同じだけど,staticメンバ関数でなく
//Handleを引数として,pObj が指す T 型オブジェクトの OnASyncLoadFinish メソッドを呼ぶ
template< class T >
void Call_OnASyncLoadFinish_Method( int Handle, void *pObj ){ ((T*)pObj)->OnASyncLoadFinish(Handle); }
みたいなtemplateでどうでしょう.
メソッド名が固定されているのがアレですが…
(どうにかすればメソッド名の側も固定じゃなくてtemplateにできるのかもしれないけど,私にはムリ^^)
あとはこれをコールバックに設定する記述を
//コールバック設定のヘルパ
//(このヘルパの関数名は思い浮かばないのでてきとー)
template< class T >
void SetASyncLoadFinishCallback_Helper( int Handle, T &Obj )
{ SetASyncLoadFinishCallback( Handle, Call_OnASyncLoadFinish_Method<T>, &Obj ); }
とか用意しとけばどうかな.
|
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.3 ) |
- 名前:通りすがり 日時:2022/03/16 14:51
> メソッド名の側も固定じゃなくてtemplateに
こうか……?
//Handleを引数として,pObj が指す T 型オブジェクトのメソッドMを呼ぶ
template< class T, typename void(T::*M)(int) >
void Call_Method( int Handle, void *pObj )
{ ( static_cast<T*>(pObj)->*M )(Handle); }
//T型のオブジェクト Obj のメソッド M がコールバックされる形に
//↑の Call_Method を SetASyncLoadFinishCallback() に指定するヘルパ
template< class T, typename void(T::*M)(int) >
void SetASyncLoadFinishCallback_Helper( int Handle, T &Obj )
{ SetASyncLoadFinishCallback( Handle, Call_Method<T,M>, &Obj ); }
---
使う側:
//このTest型の Method をコールバックに使いたいのだとして…
class Test
{
public:
void Method(int Handle){ std::cout << "Test::Method(" << Handle << ")\n"; }
};
//こんな感じか
int Handle = (略);
Test Obj;
SetASyncLoadFinishCallback_Helper< Test, &Test::Method >( Handle, Obj );
|
Re: メンパー関数対応型のSetASyncLoadFinishCallbackの要望 ( No.4 ) |
- 名前:名無三(解決) 日時:2022/03/19 12:44
>管理人さん、通りすがりさん
ありがとうございます、参考にします。
|
|