「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。
//デバイスコンテキスト・仮想DC
HDC hdc, hdcMem;
PAINTSTRUCT paint ;
//読み込むビットマップ
HBITMAP hBitmap;
画面上のデバイスコンテキストとビットマップ、
ビットマップ用のメモリデバイスコンテキストのハンドルを
格納するための変数を宣言します。
//デバイスコンテキストを取得
hdc = BeginPaint(hwnd, &paint);
//ビットマップを読み込む
hBitmap = SHLoadDIBitmap(_T("\\My Documents\\bmp.bmp"));
//仮想デバイスコンテキストを作成
hdcMem = CreateCompatibleDC(NULL);
//仮想デバイスコンテキストにビットマップを設定
SelectObject(hdcMem, hBitmap);
//仮想DCからDCへコピー
BitBlt(hdc,104,104,32,32,hdcMem,0,0,SRCCOPY);
//仮想デバイスコンテキストを削除
DeleteDC(hdcMem);
//ビットマップを削除
DeleteObject(hBitmap);
//デバイスコンテキストを解放
EndPaint(hwnd, &paint);
SHLoadDIBitmap関数でビットマップをメモリに読み込みます。
ファイルを読み込む時は絶対パスを指定しなくてはなりません。
ちなみに、このプログラムでは、このビットマップを
MyDocumentsディレクトリに置いて、使っています。
メモリDCを作成し、selectobjectでビットマップをメモリDCに設定します。
BitBltで描画した後は、メモリDCを削除した後ビットマップを削除します。
では実行してみましょう。
ワーイ!微妙な絵だー!
でも、ビットマップだけとはいえ既存の画像を
使えるようになったことで、ゲームなどへの道が大きく開けましたね。
ただし、この関数で作られたビットマップはDDB(デバイス依存ビットマップ)であり
デバイスがデバイスコンテキストの色数とビットマップの色数の違いなどを受け止めてくれるため
ビットマップファイルの画像サイズやパレット、色数などを気にせず簡単に扱えますが
そのかわり、イメージバッファへの直接操作などを扱うことは出来ないので
画像の半透過処理などといった複雑な作業には向きません。
また24ビット以上のカラーを使っているビットマップは16ビット以下のカラーに劣化され、
色数が失われることもあるでしょう。
HBITMAP SHLoadDIBitmap( LPCTSTR szFileName );
第一引数 szFileName には、ファイル名を含む絶対パスのNULLで終わる文字列を指定します
戻り値 成功なら読み込まれたビットマップのハンドルが、失敗ならNULLが返ります。
■ソースの表示■
2005/6/4