BitBlt

BitBltは、指定されたコピー元デバイスコンテキストから、指定されたコピー先デバイスコンテキストにピクセル列を転送するWindowsAPI・・・。

BitBlt 関数

これを使って、ようやくLoadImageでロードした画像を描画できるのだが、みてわかるとおりhBitmapを指定する場所は無い・・・。
ビットマップはhBitmapで直接描画できるわけではなく、SelectObjectでhBitmapを選択したメモリデバイスコンテキストhMemDCをコピー元にして、コピー先にピクセル列を転送することで、間接的に描画が可能になる・・・。
(ペンやブラシをデバイスコンテキストに選択させたように、ビットマップというハンコを選択したような感じ・・・。でそのハンコを押すためにはBitBltを使う・・・。)

"test.bmp"を描画してみよう・・・。

WM_CREATEで、

LoadImageで"test.bmp"をロードして、hBitmapを保持しておく・・・。

WM_PAINTで、

CreateCompatibleDCでウィンドウの物理デバイスコンテキストhDCを元にメモリデバイスコンテキストhMemDCを作っておく・・・。

SelectObjectで、hMemDCにhBitmapを選択させる・・・。これでhMemDCとhBitmapが紐付いたので、

BitBltでhMemDCのピクセル列( = ビットマップhBitmapのピクセル列)をhDCに転送する・・・。
コピー先の始点(0, 0)で、幅640, 高さ480, コピー元の始点も(0, 0), SRCCOPYはそのままコピー転送という意味・・・。

終わったら、元に戻してhMemDCは破棄・・・。

もちろんWM_DESTROYの時には、hBitmapも破棄する・・・。

実行すると、

f:id:BG1:20150410112052p:plain

"test.bmp"が描画された・・・。

Sample/BitBlt.cpp at master · bg1bgst333/Sample · GitHub