VC++ トップページ 

Section4.2 ビットマップ画像の表示(リソースから)

今度はリソースから読み込む方法です.
その前にまずBMPファイルをリソースに登録する方法から. テキストエディタで書く方法とVCで行う方法があります.

VCによるリソース登録
  1. メニューバー:挿入→リソース
  2. Bitmapを選択,インポート.
  3. ファイルの種類を「すべてのファイル」に,ファイルを選択,インポート.
ベースを「標準的な"Hello World!" アプリケーション」で作った場合など, 既に.rcファイル(リソースファイル)を取り込んである場合はそれを上書き保存すれば作業完了です.
以下,そのプロジェクトで初めてリソースを取り込む時の作業です.
  1. .rcファイルが作成されるので,メニューバー:ファイル→名前をつけて保存でそのプロジェクトのフォルダに保存.
  2. いったん.rcファイルを閉じる(メニューバー:ファイル→閉じる)
  3. メニューバー:プロジェクト→プロジェクトへ追加→ファイル
  4. さっき保存した.rcファイルと新しくできたヘッダファイル(普通はresource.h)を選択,OK.
  5. main関数のあるcppファイルなど,必要なファイルに #include "resource.h" を追加.
左側のワークスペースウインドウにリソースタブができます.
そこのIDB_BITMAP1のようなIDがついているのが登録したBMPファイルです.(IDを右クリック→プロパティでIDを変更可)


テキストエディタでリソースファイルを書く

ビットマップの取り込みぐらいならエディタで書いたほうが早いです.
ただVCと併用するとややこしいことになるので, VCでリソース作成や取り込みを行うかもしれない人にはあまりおすすめできません.

まず以下の2つのファイルを作成してください.ファイル名は適当でよいですが.

Script1.rc
#include <windows.h>
#include "resource.h"

IDB_BITMAP1             BITMAP  DISCARDABLE     "ric.bmp"

resource.h
#define IDB_BITMAP1                     101

VCでコンパイルする人は上記の手順6〜8と似たようなことをやってください.
cppファイルに#include "resource.h" を追加するのを忘れずに.


関数
ファイル取り込みのときのLoadImageがLoadBitmapに変わっただけです.

リソースからビットマップを読み込む
HBITMAP LoadBitmap( HINSTANCE hinst, LPCTSTR MAKEINTRESOURCE( id ) );
hinst ビットマップを取り込んだモジュールのインスタンス
main関数の第1引数をグローバルに確保しておくのが楽です
id リソースの識別子.IDB_BITMAP1など
返り値ロードしたビットマップのハンドル.エラーのときはNULL.

下準備
HDC hMdc= CreateCompatibleDC( HDC hdc );
SelectObject( HDC hMdc, HBITMAP hbmp );

ビットマップの表示 Section4.1参照.
BOOL BitBlt(HDC hdc, int dx, int dy, int w, int h, HDC hMdc, int sx, int sy, DWORD rop);
BOOL StrechBlt(HDC hdc, int dx, int dy, int dw, int dh, HDC hMdc, int sx, int sy, int sw, int sh, DWORD rop);

後始末 忘れないように
DeleteDC(HDC hMdc);
DeleteObject( HBITMAP hbmp );


使用例
リソースやヘッダのファイル名が上と違うから注意.
ソース(.cpp)  リソース(.rc)  ヘッダ(.h)  使ってる画像 (4bitビットマップ 16KB)
#define     NAME    "Section4.2 bmpresource"  //タイトルバーに表示するテキスト
#include    <windows.h>
#include    "4-2bmpres.h"

//プロトタイプ宣言
LRESULT CALLBACK   WndProc(HWND, UINT, WPARAM, LPARAM);
int     PASCAL     WinMain(HINSTANCE, HINSTANCE, LPSTR, int);

//global variable
HINSTANCE   ghInst;

//Windws イベント用関数
LRESULT  CALLBACK  WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    HDC         hdc, hMdc;
    PAINTSTRUCT ps;
    HBITMAP     hbmp;
    
    //渡された message から、イベントの種類を解析する
    switch(msg){
    case WM_CREATE:
        break;
    
    //----ペイント----
    case WM_PAINT:
        hdc= BeginPaint (hWnd, &ps);
        
        //リソースからBMPを読み込む
        hbmp= LoadBitmap( ghInst, MAKEINTRESOURCE(IDB_BITMAP1) );
        
        hMdc= CreateCompatibleDC( hdc );
        SelectObject( hMdc, hbmp );
        
        BitBlt(hdc, 10, 20, 170, 180, hMdc, 0, 0, SRCCOPY);
        StretchBlt( hdc, 10, 210, 200, 50,
                    hMdc, 40, 10, 100, 100, SRCCOPY );
        
        DeleteDC(hMdc);
        DeleteObject( hbmp );
        
        EndPaint(hWnd, &ps);
        break;
    
    //----終了処理----
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0L;
    }
    //デフォルトの処理
    return  DefWindowProc(hWnd,msg,wParam,lParam);
}

//Windows Main 関数
int PASCAL  WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine, int nCmdShow){
    HWND        hWnd;
    MSG         msg;
    
    ghInst = hInstance;
            .
            .
            .


VC++ トップページ