リソース上の画像を表示


 Visual C++でBMPファイルなどの画像データを表示させる場合は、
あらかじめ画像をリソースデータとして格納しておきプログラム実行時に

「リソースデータとして確保している画像情報を表示」

するのが基本的な方法です。

【表示手順】

(1)ビットマップデータをリソースとして確保
 表示させたい画像をリソースデータにします。

 [挿入(I)] - [リソース(R)]

 画像は新規作成するかディスク上の画像データを読み込みます。
 そこで、取り込んだ画像のリソースに以下の名前を付けます。

     IDB_BITMAP_SAMPLE

(2)ビットマップ表示用のデバイスコンテキストを用意
  ここでは、OnPaint、OnDraw関数を使用してビットマップの表示を行います。

  [OnDraw関数]
  Viewクラスを使用する場合は OnDraw関数 が提供されます。

  void xxxView::OnDraw(CDC* pDC)
    {

        コード

    }

    引数 pDC はディスプレイ表示用のデバイスコンテキストです。
  画像表示の場合は、このpDCに直接出力するのではなくメモリ上に
  別のデバイスコンテキストを用意し、そこで一旦画像イメージを生成。
 
  ・デバイスコンテキストの用意

  CDC myDC;                       //ビットマップ表示用メモリデバイスコンテキストを用意
    myDC.CreateCompatibleDC(pDC);   //pDCと互換のデバイスコンテキストを生成

  [OnPaint関数]
  ダイアログベースのでは、「OnDraw関数」が提供されません。
  そこで、「OnPaint関数」を使用します。

  void xxxDlg::OnPaint()
    {

        コード

    }

  上記のように、この関数は「デバイスコンテキスト」を渡してくれません。
  この場合は、自分で設定をする必要があります。

  CDC* pDC = this->GetDC();      //現在のデバイスコンテキストpDC
    CDC  myDC;                     //ビットマップ表示用デバイスコンテキスト
    myDC.CreateCompatibleDC(pDC);  //pDCと互換のデバイスコンテキストを生成

(3)ビットマップリソースの読み込み
  必要なオブジェクトを用意し、LoadBitmapメンバ関数を使ってビットマップリソース
  を読み込みます。

    CBitmap myBMP;                        //ビットマップ処理用オブジェクト
    myBMP.LoadBitmap(IDB_BITMAP_SAMPLE);  //画像読み込み

    上記は「IDB_BITMAP_SAMPLE」というIDを持つビットマップリソースを
  読み込み、myBMPオブジェクトに入れる処理です。

(4)CBitmapオブジェクトの結び付け
  使用するCBitmapオブジェクトをデバイスコンテキストに結び付けてやります。
  このときの現在のオブジェクトを保存しておき、後で現在復帰させます。

  CBitmap* oldBMP = myDC.SelectObject(&myBMP);    //旧ビットマップ保存とmyBMP選択
    myDC.SelectObject(oldBMP);                      //元のビットマップに戻す

(5)ビットマップイメージの転送
  メモリ上(myDC)に展開されたイメージをディスプレイに転送し、
  目に見えるようにします。これを行うには「BitBltメンバ関数」
  を使用します。

    pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY);    //ビットマップを転送

  【CDC::BitBltメンバ関数書式】

    BOOL BitBlt(int x,             //転送先左上隅のx座標
                int y,             //転送先左上隅のy座標
                int nWidth,        //表示させるビットマップの幅
                int nHeight,       //表示させるビットマップの高さ
                CDC* pSrcDC,       //転送元CDCオブジェクトのポインタ
                int xSrc,          //転送元ビットマップの左上隅のx座標
                int ySrc,          //転送元ビットマップの左上隅のy座標
                DWORD dwRop);      //転送方法

    戻り値 : 正常終了時 = 非0、異常終了 = 0

dwRop指定
説明
BLACKNESSすべての出力を黒にする
DSTINVERTパターンビットマップと転送元ビットマップを論理AND結合
MERGEPAINT反転した転送元ビットマップと転送先ビットマップを論理OR結合
NOTSRCCOPY反転した転送元ビットマップを転送先ビットマップにコピー
NOTSRCERASE転送元ビットマップと転送先ビットマップを論理OR結合し結果を反転
PATCOPYパターンビットマップを転送先ビットマップへコピーする
PATINVERTパターンビットマップと転送先ビットマップを論理XOR結合
PATPAINT反転した転送元ビットマップとパターンビットマップを論理OR結合
さらにその結果と転送先ビットマップを論理OR結合
SRCAND転送元のビットマップと転送先ビットマップのピクセルを論理AND結合
SRCCOPY転送元ビットマップを転送先ビットマップにコピー
SRCINVERT転送先ビットマップのピクセルと転送元ビットマップを論理XOR結合
SRCPAINT転送先ビットマップのピクセルと転送元ビットマップを論理OR結合
SRCERASE転送先ビットマップを反転し、その結果と転送元ビットマップを論理AND結合
WHITENESSすべての出力を白にする