BMP Object Class で画像を表示する



VC++ でファイルから BMP 画像を入力して表示する BMP Object Class を作成します。

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

プロジェクトの作成

  1. 空のプロジェクト(ObjBmpRead)を作成して、次のファイルをフォルダーに格納して下さい。
    プログラムは、この後の説明を参考にして各自で作成して下さい。
    表示する BMP ファイル(Ayu.bmp)には、適当な画像ファイルを調達してきて下さい。
    [プロジェクト] [既存項目の追加] からヘッダファイルとプログラムファイルをプロジェクトに追加します。
    ファイル名ファイルの説明
    Main.cpp Windows Main Program ファイル
    Bmp.h Bmp Object Class のヘッダファイル
    Bmp.cpp Bmp Object Class のソースファイル
    Ayu.bmp 表示する BMP 画像ファイル
  2. Main.cpp の説明です。
    BMP *Bmp.h が Object Class の定義です。
        #include    "Bmp.h"
    
        BMP         *Bmp= NULL;         //BMP Object
        
  3. WinMain() は何時もと同じでウインドウを表示するだけです。
  4. WM_CREATE で BMP Object Class をインスタンス化して画像を入力します。
            case WM_CREATE:
                Bmp= new BMP(hWnd);
                Bmp->Load("ayu.bmp");
                break;
        
  5. WM_PAINT: で画像を表示します。
    Bmp->Show() が画像を表示するメンバ関数で、50, 20 がその座標です。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                Bmp->Show(50,20);
                EndPaint(hWnd,&ps);
                break;
        
  6. WM_DESTROY: では終了する前に Object Class を開放して下さい。
            case WM_DESTROY:
                if (Bmp)
                {   delete(Bmp);
                    Bmp= NULL;
                }
                PostQuitMessage(0);
                return 0L;
        
  7. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    Bmp->Load() で入力した画像が表示されたら完成です。

【ヒント】

  1. Object Class のヘッダファイル Bmp.h です。
    画像を描画する度に毎回ファイルから画像を入力するのでは、明らかに描画速度が低下します。
    そこで「描画の準備」と「実際の描画」を分けて考えます。
    hBmp, hBmpDC に入力した画像を格納します。
    Width, Height は画像の幅と高さです。
    Load() で BMP 画像を入力して、これらの領域を設定します。
    Show() で設定した領域を使って描画します。
    hBmp と hBmpDC は Destructor で開放して下さい。
        /*★ BMP Object Header File  前田 稔 ★*/
        #define  SAFE_DELDC(p)   { if (p) { DeleteDC (p);   (p)=NULL; } }
        #define  SAFE_DELOBJ(p)  { if (p) { DeleteObject(p); (p)=NULL; } }
    
        class BMP
        { protected:
            HWND        hWnd;
            HBITMAP     hBmp;               //画像の HBITMAP
            HDC         hBmpDC;             //画像の HDC
    
          public:
            BMP(HWND hWnd);                 //Constructor
            ~BMP();                         //Destructor
            long        Width;              //画像の幅
            long        Height;             //画像の高さ
    
            HRESULT     Load(LPSTR szBitmap);
            HRESULT     Show(WORD xp, WORD yp);
        };
        
  2. Bmp.cpp はメインとは独立してコンパイルされます。
    このとき翻訳に必要なヘッダファイルを取り込んでおかなければなりません。
    意味不明の次のエラーが表示されたときはこれが原因です。
    ...\Bmp.cpp(23) : fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
    テンプレートを使って作成したときは stdafx.h を取り込んで下さい。
    #include "stdafx.h"
    空のプロジェクトから作成したときは windows.h と Object Class のヘッダファイルを取り込んで下さい。
        #include <windows.h>
        #include "bmp.h"
        
  3. BMP 画像を表示するには HDC が必要になります。
    HDC は hWnd から GetDC(hWnd) で取得することが出来ます。
    取得した HDC は用が済めば開放して下さい。
        HDC     hdc;
               :
            hdc= GetDC(hWnd);
               :
            ReleaseDC(hWnd,hdc);
               :
        
  4. サービスとして「コンストラクタとデストラクタ」を示します。
        // コンストラクタ
        BMP::BMP(HWND hwnd)
        {   hWnd= hwnd;
            hBmp= NULL;
            hBmpDC= NULL;
            Width=Height= 0;
        }
    
        // デストラクタ
        BMP::~BMP()
        {   SAFE_DELDC(hBmpDC);
            SAFE_DELOBJ(hBmp);
            Width=Height= 0;
        }
        

【演習】

  1. プログラムを完成させて下さい。
  2. 下記のページから BMP Object Class より数段レベルが高い Image Object Class を提供しています。
    Image Object Class を使えば BMP 画像だけでなく、JPEG 画像や GIF 画像も描画することが出来ます。
    ★Object Class Library

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