■ 新・ゲーム開発講座




■ へっぽこプログラミング入門♪


■第6夜:BMPの表示

テキスト表示が出来たところで、いよいよグラフィック(BMPファイル)の表示をしてみましょう。BMPの表示には、お手軽版から自力フォーマット解析までいろいろな方法がありますが、ここではお手軽版の手法を紹介します。下の関数をスケルトンにそのまま貼りつけて使いましょう♪(なんて安直 ^^;)



int Load_Bmp( HDC hdc, char *f_name_of_BMP)
{

HANDLE hbmp;
HDC work_DC;

hbmp=LoadImage (
hinst, //インスタンスのハンドル(グローバル変数を参照しています)
f_name_of_BMP, //BMPのファイル名
IMAGE_BITMAP, //読み込むのはBITMAP
0, //幅 (0を指定するとBMPに自動フィット)
0, //高さ(0を指定するとBMPに自動フィット)
LR_CREATEDIBSECTION | LR_LOADFROMFILE //DIB形式で、ファイルから読む

);

work_DC = CreateCompatibleDC( hdc ); //作業用DCを取得
SelectObject( work_DC, hbmp ); //DCと読み込んだBMPを結び付ける

BitBlt(hdc,0,0,640,480,work_DC,0,0,SRCCOPY); //転送

ReleaseDC( hwnd,work_DC ); //作業用DCを消去
DeleteObject( hbmp ); //読み込んだ画像も消去

return 0;


}

さて、貼りつけておしまい・・・・では悲しすぎますので(笑)、多少の解説をしてみようと思います。この記述、前回のフォント設定とほとんど同じことに皆さんはお気づきになりましたでしょうか。CreateFont()の代わりに LoadImage()が置き換わったようなものです。

まず LoadImage()ですが、このAPIはアイコンやカーソルなどの読み込みも可能なマルチな仕様の読み込み関数となっています。今回は外部ファイルからBMPをDIB形式で読んで、その読み込んだデータのハンドルを hbmp に取得しています。

HANDLE LoadImage(
HINSTANCE hinst, //インスタンスへのハンドル
LPCTSTR lpszName, // イメージの名称
UINT uType, // イメージタイプ
int cxDesired, // 幅
int cyDesired, // 高
UINT fuLoad // 読み込みフラグ

);


UINT uType,

IMAGE_BITMAP

ビットマップをLOAD

IMAGE_CURSOR

カーソルをLOAD

IMAGE_ICON

アイコンをLOAD


UINT fuLoad

LR_CREATEDIBSECTION
デバイス非依存のDIB形式

LR_LOADFROMFILE
ファイルから読む(このフラグが指定されない場合はlpszNameはリソース名として解釈されます)

ILR_DEFAULTSIZE
イメージの幅/高さとしてシステムのデフォルト値を使用する。この指定をしないで、なおかつ引数の幅/高さを0にすると、実際のBITMAPのサイズが適用されてとても便利(^^)

次に work_DC = CreateCompatibleDC( hdc ) で、作業用に臨時のDC(デバイスコンテキスト)を生成しています。DCとは、画像データにアクセスするときに必要な各種情報を盛り込んだオブジェクトです。ここでは、プログラム起動時に開いたウィンドウと同じ属性のDCを作成しています。

そして、SelectObject()で以降の画面操作対象として選択しておきます。これで、画像データにをウィンドウに転送する準備が出来ました。

転送そのものは、BitBlt() によって行います。APIの引数をみれば分かりますが、転送元、転送先ともにDCを取得しておく必要があります。



BitBlt(









);
hdc, //転送先のDC
0, //転送先座標 X
0, //転送先座標 Y
640, //転送する矩形エリアの幅
480, //転送する矩形エリアの高さ
work_DC,//転送元のDC
0, //転送元の座標 X
0, //転送元の座標 Y
SRCCOPY //転送オプション(SRCCOPY=そのままそっくり転送)


さて、転送が終ったら、用済みになった作業用DCを ReleaseDC() で消去して、さらに読み込んだ画像データも DeleteObject() で消去しておきます。最終的には、転送先のウィンドウ上にのみ、画像データが残ります。

だいたいのイメージが、伝わりましたでしょうか? サンプルソースがここにありますので、いろいろ改造して試してみてください。サンプルソースでは、g_tool.cpp にBMP表示部分を記述してあります。なお、オマケとしてフルカラーBMPの自力解読表示関数も入れておきましたので参考にしてください(猫サイトのソースをかなり参考にしています:笑 ^^;)。




サンプルソース実行画面♪