複数画像の表示切り替え

概要:複数の画像を用意して、ユーザーの指示で表示させる画像を切り替える

ある操作をしたら画像が切り替わる……よくある処理ですね。
今回は、全てサイズが同じ背景画像を切り替える、という前提で話を進めていきます。

■背景画像の用意

背景画像はプログラムで作成しても、ファイルから読み込んでも同じですが、
ゲームに使うならBMPファイルを使うでしょうね、普通。
今回はBMPファイルをDDBとして読み込みます。

画像の用意はプログラム起動直後にまとめて行います。
必要になったら作成/読み込んでいたのでは、時間がかかりすぎます。
相当大規模なゲームでも作らない限り、画像の作成/読み込みは、
プログラム起動直後に全て行うものと心がけて下さい。

また、背景に使う用途を想定しているのですから、画像のサイズは当然同じはずです。
このプログラムではサイズが異なると、不具合が出ます。

#define BMP_SUM    3    //画像の総数

HBITMAP hBitmap;
int i;
const char *filename[BMP_SUM]={"Airplane.bmp","Lighthouse.bmp","Parrots.bmp"};
static HDC hMemDC[BMP_SUM];
static BITMAP bmp;

hdc=GetDC(hWnd);
for(i=0;i<BMP_SUM;i++){
    hBitmap=(HBITMAP)LoadImage(0,filename[i],IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    hMemDC[i]=CreateCompatibleDC(hdc);
    SelectObject(hMemDC[i],hBitmap);
}
//画像のサイズは全て同じ(という設定)
GetObject(hBitmap,sizeof(BITMAP),&bmp);
DeleteObject(hBitmap);
ReleaseDC(hWnd,hdc);

■ユーザーの指示

今回は、マウスの左ボタンをクリックする度に表示する画像が変更されるようにします。
どの画像を表示させるかは静的変数 bmp_index が管理します。
従ってここでの処理は、現在の画像番号の更新と再描画メッセージの発行、これだけです。

ここで画像を作成/読み込むようなプログラムはNGです。

static int bmp_index;   //現在の画像番号

case WM_LBUTTONDOWN:
    if(++bmp_index >= BMP_SUM) bmp_index=0;
    InvalidateRect(hWnd,NULL,FALSE);
    return 0;

■表画面への転送

表画面に転送する画像の番号は bmp_index が管理しています。

case WM_PAINT:
    hdc=BeginPaint(hWnd,&ps);
    BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC[bmp_index],0,0,SRCCOPY);
    EndPaint(hWnd,&ps);
    return 0;

■画像の削除

作成した個数だけ削除する事を忘れないで下さい。

case WM_DESTROY:
    for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]);
    PostQuitMessage(0);
    return 0;

サンプル画像を示しても意味がないと思うので、自分で動かして確認して下さい。

★☆ ソースファイル表示 ☆★


戻る / ホーム