|
[図2-1] :
図2-1の「AND」や「OR」といった文字は,BitBltの最後のパラメータであるラスターオペレーションを意味しています.「AND」のときはSRCAND,「OR」のときはSRCPAINT,「INVERT」はDSTINVERTです.
ANDすると,転送元と転送先の一つ一つのピクセルにおいて,どちらかが黒(ビットが0)のピクセルのとき,必ず黒になります.
ORすると,どちらかが白(ビットが1)のピクセルのとき,必ず白になります.
この特性は,カラーのビットマップにモノクロを転送しても同じです.こういった特性を駆使して,透けた描画ができるのです.
リスト2-1にサンプルプログラムを示します.このサンプルは汎用性を持たせるように作ったため,結構ムダがあります.状況に応じて最適化できると思いますので,自分でいろいろ変えてみましょう.
[リスト2-1] :
VOID PASCAL sample_SpriteBlt( HDC hdc, /*描画先DC */ HBITMAP hBmp, /*ビットマップ */ int xxx, /*描画する位置(x) */ int yyy, /*描画する位置(y) */ int width, /*描画する幅 */ int height, /*描画する高さ */ COLORREF rgbBack /*透ける色 */ ) { HDC hdcmemSrc; /*元のBMP用*/ HANDLE holdSrc; HDC hdcmemSrc2; /*元のBMPの複製用*/ HANDLE holdSrc2; HBITMAP hBmpSrc2; HDC hdcmemMono; /*モノクロ化したBMP用*/ HANDLE holdMono; HBITMAP hBmpMono; HDC hdcmemG; /*描画先DCの複製(作業用)*/ HANDLE holdG; HBITMAP hBmpG; hdcmemSrc = CreateCompatibleDC(hdc); hdcmemSrc2 = CreateCompatibleDC(hdc); hdcmemMono = CreateCompatibleDC(hdc); hdcmemG = CreateCompatibleDC(hdc); hBmpSrc2 = CreateCompatibleBitmap(hdc, width, height); hBmpMono = CreateBitmap(width, height, 1, 1, NULL); hBmpG = CreateCompatibleBitmap(hdc, width, height); holdSrc = SelectObject(hdcmemSrc, hBmp); holdSrc2= SelectObject(hdcmemSrc2, hBmpSrc2); holdMono = SelectObject(hdcmemMono, hBmpMono); holdG = SelectObject(hdcmemG, hBmpG); /* キャプチャ */ BitBlt(hdcmemG, 0, 0, width, height, hdc, xxx,yyy, SRCCOPY); /* モノクロ化 */ SetBkColor(hdcmemSrc, rgbBack); BitBlt(hdcmemMono, 0, 0, width, height, hdcmemSrc, 0,0, SRCCOPY); /* AND(繰り抜き) */ BitBlt(hdcmemG, 0, 0, width, height, hdcmemMono, 0,0, SRCAND); /* INVERT(モノクロ反転) */ BitBlt(hdcmemMono, 0, 0, width, height, NULL, 0,0, DSTINVERT); /* AND(背景色消去) */ BitBlt(hdcmemSrc2, 0, 0, width, height, hdcmemSrc, 0,0, SRCCOPY); BitBlt(hdcmemSrc2, 0, 0, width, height, hdcmemMono, 0,0, SRCAND); /* OR(重ね) */ BitBlt(hdcmemG, 0, 0, width, height, hdcmemSrc2, 0,0, SRCPAINT); /* 描く */ BitBlt(hdc, xxx, yyy, width, height, hdcmemG, 0,0, SRCCOPY); SelectObject(hdcmemSrc, holdSrc); SelectObject(hdcmemSrc2, holdSrc2); SelectObject(hdcmemMono, holdMono); SelectObject(hdcmemG, holdG); DeleteObject(hBmpSrc2); DeleteObject(hBmpMono); DeleteObject(hBmpG); DeleteDC(hdcmemSrc); DeleteDC(hdcmemSrc2); DeleteDC(hdcmemMono); DeleteDC(hdcmemG); }