Image List でアニメーション

VC++ で Image List に画像を登録して、タイマ割り込みでアニメーションをします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 空のプロジェクトを作成して、次のファイルを格納して下さい。
    画像は 896×216×8bit を使っていますが、仕様が異なれば一部プログラムの修正が必要です。
    Main.cpp メインプログラム
    Gial.bmp 7枚横に並べたアニメーション用の画像ファイル
    Girl.bmp は高さが 216 ドットで、一枚の幅が 128 ドットのスプライトを横に7枚並べた画像です。
    背景の色(黒)は透明色に設定されています。
    下記の画像を使うときは BMP 形式に変換して下さい。

  2. Main.cpp を [プロジェクト][既存項目の追加] からプロジェクトに追加します。
    画像は BMP ファイルから直接入力します。
  3. ビルドに続いて実行を行います。
    7枚の画像がタイマで切り替わり、アニメーションされたら完成です。

プログラムの説明

  1. CommonControls を使うときは commctrl.h を取り込んで COMCTL32.LIB をリンクして下さい。
    ID_TIMER はタイマIDの定義です。
    hImage が Image List の定義です。
    No には、タイマで切り替える画像の番号を格納します。
        #include    <windows.h>
        #include    <commctrl.h>
        #pragma     comment(lib,"comctl32.lib")
        #define     ID_TIMER    (WM_APP + 0)
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        HIMAGELIST  hImage;
        int         No= 0;
        
  2. WinMain() は何時もと同じでウインドウを表示するだけです。
    WM_DESTROY も前回と同じです。
  3. WM_CREATE: では初期化の後でタイマを設定して下さい。
            case WM_CREATE:
                InitCommonControls();
                AppInit();
                SetTimer(hWnd,ID_TIMER,200,NULL);
                break;
        
  4. WM_PAINT: では Image List に登録された No の画像を表示します。
            case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                ImageList_Draw(hImage,No,hdc,10,10,ILD_NORMAL);
                EndPaint(hWnd, &ps);
                break;
        
  5. WM_TIMER: では7枚の画像を順に切り替えます。
            case WM_TIMER:
                No= (No+1)%7;
                InvalidateRect(hWnd,NULL,TRUE);
                break;
        
  6. Image List を生成して画像を登録する関数 AppInit() です。
    ImageList_Create() で Image List を生成します。
    128,216 が画像のサイズで、ILC_COLOR8 が256色の指定で ILC_MASK が透明色を使用するフラグです。
    7が登録する枚数で、最後のパラメータにはゼロを指定して下さい。
    LoadImage() でファイルから画像を入力します。
    ImageList_AddMasked() で白を透明色 RGB(255,255,255) に設定して Image List に登録します。
    このとき指定された画像の幅が Image List より大きいと自動的に切り分けられます。
    高さも切り分けてくれると有り難いのですが、残念ながら無視されてしまいました。
        void  AppInit()
        {   HBITMAP     hBmp;
            hImage = ImageList_Create(128,216,ILC_COLOR8 | ILC_MASK,7,0);
            hBmp= (HBITMAP)LoadImage(NULL,"Girl.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
            if (ImageList_AddMasked(hImage,hBmp,RGB(255,255,255))==-1)
                MessageBox(NULL,"ImageList_AddMasked Error","Image List",MB_OK);
            DeleteObject(hBmp);
        }
        

【演習】

  1. アニメーション画像を調達して、プログラムを完成させて下さい。
  2. D-Pixed で GIF ファイルを読み込むとレイヤに分けて格納されるので、一枚ずつ切り出すことができます。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)