画像をリソースとして組み込む



VC++ でリソースとして取り込んだ BMP 画像を表示する基本プログラムです。

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

プロジェクトの設定

  1. 表示する BMP 画像を用意して下さい。
    原則的に BMP 画像であれば何でも良いのですが、縦横共に300ピクセル程度の24ビット形式が良いでしょう。
  2. 新規プロジェクト(Bmp)を作成して WM_PAINT の位置までスクロールして下さい。
    プロジェクトの作成は Windows プログラムを自動的に作成する を参照して下さい。
  3. WM_PAINT に画像を表示するコードを追加します。
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 描画コードをここに追加してください...
            HDC             hBmpDC;
            HBITMAP         hBitmap;
            BITMAP          bm;
    
            hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
            if (hBitmap!=NULL)
            {   hBmpDC = CreateCompatibleDC(hdc);
                SelectObject(hBmpDC, hBitmap);
                GetObject(hBitmap, sizeof(bm), &bm);
                BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hBmpDC,0,0,SRCCOPY);
                DeleteDC(hBmpDC);
                DeleteObject(hBitmap);
            }
            EndPaint(hWnd, &ps);
            break;
        
  4. BMP 画像をリソースとして取り込みます。
  5. [デバッグ]を選択してビルドに続いて実行を行います。
    ウインドウが開かれて BMP 画像が表示されたら完成です。

プログラムの説明

  1. LoadBitmap() でリソースとして取り込んだ画像を取得します。
    hBitmap にロードした画像のポインタが設定されます。
    エラーのときは NULL が返されます。
    現在のウインドウ(hdc) と互換性のあるデバイスコンテキストを作成して hBmpDC に保存します。
    hBmpDC に hBitmap を設定して描画の準備が整います。
            HDC             hBmpDC;
            HBITMAP         hBitmap;
            BITMAP          bm;
    
            hBitmap = LoadBitmap(hInst,"IDB_BITMAP1");
            if (hBitmap!=NULL)
            {   hBmpDC = CreateCompatibleDC(hdc);
                SelectObject(hBmpDC, hBitmap);
        
  2. GetObject() で hBitmap にロードした画像情報(幅や高さ)を取得します。
    BitBlt() で hBmpDC から hdc に画像を描画します。
            BITMAP          bm;
    
                GetObject(hBitmap, sizeof(bm), &bm);
                BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hBmpDC,0,0,SRCCOPY);
        
  3. 割り当てた HDC, BITMAP などは用が済めば開放するのがルールです。
    面倒な手順ですが Windows で画像を描画するときの標準的な方法です。
                DeleteDC(hBmpDC);
                DeleteObject(hBitmap);
            }
            EndPaint(hWnd, &ps);
        

【NOTE】

BitBlt() の説明です。
ソース 説明
BitBlt 画像を表示する関数
hdc デバイスコンテキスト
0,0 ウインドウの左上座標
bm.bmWidth 表示する大きさ(横幅)
bm.bmHeight 表示する大きさ(高さ)
hBmpDC BMP 画像のコンテキスト
0,0 BMP 画像の左上座標
SRCCOPY コピー元をそのままコピー

デバイスコンテキスト(DC)とは出力デバイスに関する情報を格納する構造体で、出力は一旦 DC に出力されて、DC からハードウエアに出力されます。
出力デバイスは装置に依存する部分が多く同じように扱うことができないので、DC を経由することにより装置の違いを吸収します。
プリンタへの出力で説明していますが、デバイスコンテキストを使えば描画と同じ要領で印字することが出来ます。


【拡大・縮小】

BMP 画像を「拡大・縮小」して表示するときは BitBlt() に代えて StretchBlt() を使います。
{   HBITMAP     hbmp;
    BITMAP      bmp;
    HDC         hMdc;

    BitBlt(hdc,0,20,bmp.bmWidth,bmp.bmHeight,hMdc,0,0,SRCCOPY);
    StretchBlt(hdc,300,50,bmp.bmWidth*2/3,bmp.bmHeight*2/3,hMdc,0,0,
               bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    StretchBlt(hdc,500,60,bmp.bmWidth/2,bmp.bmHeight/2,hMdc,0,0,
               bmp.bmWidth,bmp.bmHeight,SRCCOPY);

StretchBlt() の説明

ソース 説明
hdc デバイスコンテキスト
300,50 ウインドウの左上座標
bmp.bmWidth*2/3 表示する大きさ(横幅)
bmp.bmHeight*2/3 表示する大きさ(高さ)
hMdc BMP 画像のコンテキスト
0,0 表示する BMP 画像の左上座標
bmp.bmWidth 表示する BMP 画像の幅
bmp.bmHeight 表示する BMP 画像の高さ
SRCCOPY コピー元をそのままコピー

【演習】

  1. 作成された実行形式のファイル(Bmp.exe) をデスクトップにコピーして、ダブルクリックで起動してみて下さい。
    実行形式のファイルの中にリソースとして取り込んだ画像が含まれています。
  2. ウインドウの左上座標を変更してみて下さい。
  3. BMP 画像の左上座標を変更してみて下さい。
  4. 表示する大きさ(幅や高さ)を変更してみて下さい。
    画像の一部を切り出して表示することも簡単に出来ます。
  5. BitBlt() に代えて StretchBlt() を使えば、BMP 画像を「縮小・拡大」して表示することができます。
    次の画像を表示して下さい。


【BMP のインポートが出来ない】

何故か .NET 2003 でリソースメニューから BMP ファイルをインポート出来ないことがあります。
そのときは次の方法で対処して下さい。
正常に描画が出来たときの BMP.rc に記述されている Bitmap の定義です。
"IDB_BITMAP1" としているので resource.h では IDB_BITMAP1 は定義されていません。
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//

IDB_BITMAP1             BITMAP                  "ayu.bmp"

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