2010年10月29日

アニメーションリソースの読み込み



アニメーションリソース(RT_ANICURSOR/RT_ANIICON)の内容はANIファイルと同じ構成なので、「ANIファイルの読み込み」で紹介した関数群に少し手を加えるだけで済む訳ですが、実際にアニメーションリソースVisualC++のリソースエディタで作成しようとすると、アニメーションリソースを処理する機能がないためか、データリソースに分類されてしまいます。そこで今回はANIファイルリソースに組み込む方法と、リソースから読み込むプログラムについて解説します。




まずはアニメーションリソースVisualC++リソースエディタを使って、リソースに組み込む方法を解説します。
VisualC++のメニューから「プロジェクト」→「リソースの追加」を選択すると、「リソースの追加」ダイヤログが表示されます。



リソースの追加」ダイヤログで「インポート」ボタンを押すと、「インポート」ダイヤログが表示されるので、「res」フォルダーにある「metronom.ani」を選択して、「開く」ボタンを押します。



カスタムリソースタイプ」ダイヤログが表示されるので、リソースタイプアニメーションカーソルの場合は「21」と入力し、アニメーションアイコンの場合は「22」と入力してから、「OK」ボタンを押します。



入力したアニメーションカーソルリソースビューの中にある”21”(アニメーションアイコンの場合は”22”)という新たなフォルダーに格納され、データ内容がダンプエディタに表示されれば成功です。VC++のプログラムからリソースタイプRT_ANICURSORとしてAPIFindResource関数で読み込めば、”21”のフォルダーにあるリソースが参照され、RT_ANIICONとして読み込めば”22”のフォルダーにあるリソースが参照されます。



次にアニメーションリソースを読み込むコードについて解説します。
リソースを格納しているファイル(DLL、EXEファイル)を開いてリソースハンドルを取得し、リソースを読み込みます。

//リソースを格納しているファイル(DLL、EXEファイル)を開いて
//リソースハンドルを取得し、リソースを読み込みます。
//bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。

BOOL CANIFile::LoadResource(LPCTSTR lpszExeName,LPCTSTR lpName,LPCTSTR lpType,BOOL bDeleteDIB)
{
HMODULE hModule=::LoadLibraryEx(lpszExeName,NULL,
LOAD_LIBRARY_AS_DATAFILE|LOAD_WITH_ALTERED_SEARCH_PATH);
if (!hModule) return FALSE;
BOOL bResult=LoadResource(hModule,lpName,lpType,bDeleteDIB);
::FreeLibrary(hModule);
return bResult;
}


既知のリソースハンドルからの読み込み

//リソースからの読み込み
//lpNameはリソース名で、リソースIDをMAKEINTRESOURCEマクロで型キャストした値が入ります。
//lpTypeはリソース形式で、この関数では以下の2種類のリソースが読み込めます。
// アニメーションカーソル:RT_ANICURSOR(21)
// アニメーションアイコン:RT_ANIICON(22)
//bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。

BOOL CANIFile::LoadResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType,BOOL bDeleteDIB)
{
//リソース内で、指定したリソース名のリソースハンドルを取得します。
HRSRC hResInfo=::FindResource(hModule,lpName,lpType);
if (!hResInfo) return FALSE;

//リソースをグローバルメモリにロードします。
HGLOBAL hGlobal=::LoadResource(hModule,hResInfo);
if (!hGlobal) return FALSE;

//メモリ内の指定されたリソースをロックします。
LPVOID pGlobal=::LockResource(hGlobal);
if (!pGlobal) return FALSE;

//指定したリソースのサイズ(バイト数)を取得します。
DWORD dwResSize=::SizeofResource(hModule,hResInfo);
if (!dwResSize) return FALSE;

if (!LoadFromMem((HPSTR)pGlobal,dwResSize,bDeleteDIB)) return FALSE;

SetType(lpType);
SetName(lpName);
return TRUE;
}


メモリーからアニメーションカーソルを読み込みます。

//メモリーからの読み込み
//bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。

BOOL CANIFile::LoadFromMem(HPSTR pchBuffer,LONG memSize,BOOL bDeleteDIB)
{
//MMIOINFO構造体の作成
MMIOINFO mmioInfo={0};
mmioInfo.pchBuffer=pchBuffer; //メモリーバッファーの先頭アドレス
mmioInfo.fccIOProc=FOURCC_MEM; //メモリーから読み込む
mmioInfo.cchBuffer=memSize; //メモリーバッファサイズ
//メモリーファイルとして開きます。

HMMIO hmmio=::mmioOpen(NULL,&mmioInfo, MMIO_ALLOCBUF|MMIO_READ);
if (!hmmio) return FALSE;
Delete();
//ANIストリームからの読み込み
BOOL bResult=StreamIn(hmmio,bDeleteDIB);
::mmioClose(hmmio,0);
return bResult;
}



サンプルプログラム(VisualC++net2003ソリューション)ANIFileTest03A.zip

上記のzipファイルをダウンロードしてからWinRAR等で解凍し、ANIFileTest03Aフォルダー内にある「ANIFileTest.sln」を開きます。「F5」キーを押すと、ビルド確認のダイヤログが表示されるので「Yes」を選択してソリューションをビルドします。



ビルドが終わると、直ちにプログラムが自動起動してウィンドウが表示されます。メニューから「ファイル」/「開く」を選択して、「ファイルを開く」ダイヤログを表示させます。



Debugフォルダー内の「ANIFileTest.exe」を選択し「開く」ボタンを押すと「リソースの選択」ダイヤログが表示されるので、「リソース形式:」コンボボックスで「アニメーションカーソル」を選択して、「リソース名:」コンボボックスで適当なリソース名を選択して「適用」ボタンを押してください。(サンプルプログラムでは選択できるリソース名は134番のみです。)



画像が表示されたところで、画像にカーソルを合わせてから左クリックして動画が再生されるか確認してください。






posted by ひろし at 15:36| Comment(0) | ANIファイルフォーマット | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。