以前のテクニックで裏画面を作って描画するというものがありましたが、そのとき用いたBitBltを 使って、指定した色を透明にして描画するという方法を紹介します。のっけからやる気をなくさせるようなことを言うとタイトル通り実行速度は遅いです。でもまぁ アクションゲームを作るのでなければ十分でしょう。
最初に動作の中身だけを説明しましょう。まず描画する画像を用意します。
つぎに、描画したい部分が黒で、透過したい部分が白のモノクロビットマップを作成します。
モノクロビットマップを元に、透過部分が真っ黒なビットマップを作成します
描画先の画像を用意します
2つ目のビットマップをある方法で描画して、描画したい部分が黒くなるようにします
3つ目のビットマップをある方法で描画して、できあがりです。
少し具体例を挙げますと
SRCAND オプション 転送元と転送先のビットが1ならば転送先は1それ以外は転送先は0 MERGEPAINT オプション 転送元と転送先のどちらかのビットが1ならば転送先は1両方0ならば転送先は0一般的にすると、F(転送元のビット,転送先のビット)=転送先のビット
これが最終目標ですね。
この二つをSRCINVERT(From:0 To:1 or From:1 To:0で To 1)で転送すれば、最終目標の画像に辿りつけます。
上左の画像を作るには、転送元画像に、モノクロビットマップを反転したものをSRCANDで結合します。(転送オプションでできるので反転したものはいちいち作らない)
上右の画像を作るには、転送先画像に、モノクロビットマップをSRCANDで結合します。
あまりうまく説明できてませんが、別に分からなければ できないというわけではないので、BitBltのラストオペーレーションを使いながら覚えてください。 以下にプログラムリストを表示します。
void Blit(HDC from,HDC to,int x,int y,int width,int height,int fromx,int fromy,COLORREF tran) { HBITMAP bmono,oldmono,bkuro,oldkuro; HDC mmono,mkuro; /* 描画するビットマップと同じサイズのモノクロビット マップを作成し透明色の部分が白それ以外が黒となるよう にする。 */ mmono=CreateCompatibleDC(from); bmono=CreateBitmap(width,height,1,1,NULL); oldmono=(HBITMAP)SelectObject(mmono,bmono); SetBkColor(from,tran); BitBlt(mmono,0,0,width,height,from,fromx,fromy,SRCCOPY); /* メモリDCを作成し、元のビットマップと同じ物をコピーする。 モノクロビットマップにNOT演算したものを 作ったメモリDCにラスタオペレーションSRCANDでブリットしている。 */ mkuro=CreateCompatibleDC(from); bkuro=CreateCompatibleBitmap(from,width,height); oldkuro=(HBITMAP)SelectObject(mkuro,bkuro); BitBlt(mkuro,0,0,width,height,from,fromx,fromy,SRCCOPY); BitBlt(mkuro,0,0,width,height,mmono,fromx,fromy,0x220326); //↑のラスタオペレーションでNOT演算とSRCANDの作業が一度にできる /* 出力先のDCにモノクロビットマップを持つDCを ラスタオペレーションSRCANDでブリットし もう一つのDCをラスタオペレーションSRCINVERTでブリットする。 */ BitBlt(to,x,y,width,height,mmono,fromx,fromy,SRCAND); BitBlt(to,x,y,width,height,mkuro,fromx,fromy,SRCINVERT); SelectObject(mmono,oldmono); DeleteObject(bmono); DeleteDC(mmono); SelectObject(mkuro,oldkuro); DeleteObject(bkuro); DeleteDC(mkuro); }