BMPをDDBとして読み込む

概要:BMPをDDBとして読み込みます

BMPをファイルから読み込む方法、リソースから読み込む方法の両方を解説します。

■BMPファイルを読み込む

BMPファイルをDDBとして読み込むのは簡単です。
それには LoadImage 関数を使います。

HANDLE LoadImage(
  HINSTANCE hinst,    // インスタンスのハンドル
  LPCTSTR lpszName,  // イメージの名前または識別子
  UINT uType,       // イメージのタイプ
  int cxDesired,      // 希望する幅
  int cyDesired,      // 希望する高さ
  UINT fuLoad       // ロードのオプション
);


hinst はリソースから読み込む時に必要です。ファイルから読み込む時は 0 を指定して下さい。
uType には IMAGE_BITMAP を指定して下さい。
 他にも IMAGE_CURSOR を指定すればカーソルを、IMAGE_ICON を指定すればアイコンを読み込む事ができます。
cxDesired と cyDesired に 0 を指定すると、実際のサイズが使われます。
fuLoad には LR_LOADFROMFILE を指定して下さい。これを指定しないとリソースから読み込もうとします。

HBITMAP hBitmap;

//ビットマップを読み込む
hBitmap=(HBITMAP)LoadImage(0,"Mandrill.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(hBitmap==NULL){
    MessageBox(hWnd,"ビットマップがありません",NULL,MB_OK);
    return 0;
}

この時の LoadImage 関数の戻り値はビットマップハンドルなので、
別途作成したメモリデバイスコンテキストに選択してやりましょう。
メモリデバイスコンテキストにビットマップを選択すると、幅や高さ、色数だけでなく、
ビットマップに描画されている内容もコピーされます。

static HDC hMemDC;
static BITMAP bmp;

//メモリデバイスコンテキストの作成
hMemDC=CreateCompatibleDC(NULL);
SelectObject(hMemDC,hBitmap);
//ビットマップの情報を取得
GetObject(hBitmap,sizeof(BITMAP),&bmp);
//ビットマップ削除
DeleteObject(hBitmap);

上記のプログラムでは、ビットマップの幅と高さを取得するために GetObject 関数を使っています。
GetObject 関数に渡している BITMAP 構造体は次のようになっています。

typedef struct tagBITMAP {
  LONG bmType;
  LONG bmWidth;
  LONG bmHeight;
  LONG bmWidthBytes;
  WORD bmPlanes;
  WORD bmBitsPixel;
  LPVOID bmBits;
} BITMAP, *PBITMAP;


bmWidth が幅、
bmHeight が高さです。
他はあまり使わないでしょう。

//表画面へ転送
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC,0,0,SRCCOPY);

★☆ ソースファイル表示 ☆★

■BMPリソースを読み込む

ファイルからの読み込み同様に LoadImage 関数を使います。
ファイルから読み込む時と違うのは、
hinst にインスタンスハンドルを指定して、fuLoad に 0 を指定する事です。

HANDLE LoadImage(
  HINSTANCE hinst,    // インスタンスのハンドル
  LPCTSTR lpszName,  // イメージの名前または識別子
  UINT uType,       // イメージのタイプ
  int cxDesired,      // 希望する幅
  int cyDesired,      // 希望する高さ
  UINT fuLoad       // ロードのオプション
);


lpstName には、リソースに名前を与えていれば "BITMAP" のように書き、
序数を与えていれば MAKEINTRESOURCE(IDB_BITMAP) のように書きます。

名前はリソースファイル(.rc)に記述され、自動的にインクルードされますが、
序数を与えている場合は #include"resource.h" が必要です。

■インスタンスハンドルの取得

インスタンスハンドルの取得には幾つか方法があります。

一番簡単なのは WinMain 関数の HINSTANCE 引数をグローバル変数に保存しておく事です。
次によく使われるのが GetWindowLong 関数を使う方法です。
これらの方法はどこでも使う事ができるのが利点です。

もう一つ、変わり種として、WM_CREATE の LPARAM を使う方法があります。
WM_CREATE の LPARAM には LPCREATESTRUCT が入っています。

typedef struct tagCREATESTRUCT {
  LPVOID lpCreateParams;
  HINSTANCE hInstance;
  HMENU hMenu;
  HWND hwndParent;
  int cy;
  int cx;
  int y;
  int x;
  LONG style;
  LPCTSTR lpszName;
  LPCTSTR lpszClass;
  DWORD dwExStyle;
} CREATESTRUCT, *LPCREATESTRUCT;


そしてこの CREATESTRUCT 構造体の hInstance メンバーにインスタンスハンドルが入っているのです。
hInst=((LPCREATESTRUCT)lParam)->hInstance;

HINSTANCE hInst;
HBITMAP hBitmap;

hInst=(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
//ビットマップを読み込む
hBitmap=(HBITMAP)LoadImage(hInst,"BITMAP",IMAGE_BITMAP,0,0,0);
if(hBitmap==NULL){
    MessageBox(hWnd,"ビットマップがありません",NULL,MB_OK);
    return 0;
}

★☆ ソースファイル表示 ☆★


戻る / ホーム