アニメーションリソース(RT_ANICURSOR/RT_ANIICON)の内容はANIファイルと同じ構成なので、「ANIファイルの読み込み」で紹介した関数群に少し手を加えるだけで済む訳ですが、実際にアニメーションリソースをVisualC++のリソースエディタで作成しようとすると、アニメーションリソースを処理する機能がないためか、データリソースに分類されてしまいます。そこで今回はANIファイルをリソースに組み込む方法と、リソースから読み込むプログラムについて解説します。
まずはアニメーションリソースをVisualC++のリソースエディタを使って、リソースに組み込む方法を解説します。
VisualC++のメニューから「プロジェクト」→「リソースの追加」を選択すると、「リソースの追加」ダイヤログが表示されます。
「リソースの追加」ダイヤログで「インポート」ボタンを押すと、「インポート」ダイヤログが表示されるので、「res」フォルダーにある「metronom.ani」を選択して、「開く」ボタンを押します。
「カスタムリソースタイプ」ダイヤログが表示されるので、リソースタイプにアニメーションカーソルの場合は「21」と入力し、アニメーションアイコンの場合は「22」と入力してから、「OK」ボタンを押します。
入力したアニメーションカーソルがリソースビューの中にある”21”(アニメーションアイコンの場合は”22”)という新たなフォルダーに格納され、データ内容がダンプエディタに表示されれば成功です。VC++のプログラムからリソースタイプをRT_ANICURSORとしてAPIのFindResource関数で読み込めば、”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番のみです。)
画像が表示されたところで、画像にカーソルを合わせてから左クリックして動画が再生されるか確認してください。