ActiveBasic 透過画像の作り方
ゲームを作っています。
そのときに、背景を透過した画像を作る関数を書いたのですが、どうしてもうまく処理が出来ません。
Function CreateMask(hBmp As HBITMAP) As HBITMAP
Dim hDC As HDC
Dim hBaseDC As HDC,hBaseBmp As HBITMAP
Dim hMaskDC As HDC,hMaskBmp As HBITMAP
Dim hTempDC As HDC,hTempBmp As HBITMAP
Dim hCompDC As HDC,hCompBmp As HBITMAP
Dim bmp As BITMAP
Dim dummy[5] As HBITMAP
hDC=GetDC(hMainWnd)
hBaseDC=CreateCompatibleDC(hDC)
hMaskDC=CreateCompatibleDC(hDC)
hTempDC=CreateCompatibleDC(hDC)
hCompDC=CreateCompatibleDC(hDC)
GetObject(hBmp,len(bmp),bmp)
hMaskBmp=CreateCompatibleBitmap(hMaskDC,bmp.bmWidth,bmp.bmHeight)
hBaseBmp=CreateCompatibleBitmap(hDC,bmp.bmWidth,bmp.bmHeight)
hCompBmp=CreateCompatibleBitmap(hDC,bmp.bmWidth,bmp.bmHeight)
dummy[0]=SelectObject(hTempDC,hBmp)
dummy[1]=SelectObject(hMaskDC,hMaskBmp)
dummy[2]=SelectObject(hBaseDC,hBaseBmp)
dummy[3]=SelectObject(hCompDC,hCompBmp)
SetBkColor(hTempDC,GetPixel(hTempDC,0,0))
BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hTempDC,0,0,NOTSRCCOPY)
BitBlt(hBaseDC,0,0,bmp.bmWidth,bmp.bmHeight,hTempDC,0,0,SRCCOPY)
BitBlt(hBaseDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND)
BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,NOTSRCCOPY)
BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND)
BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hBaseDC,0,0,SRCPAINT)
SelectObject(hTempDC,dummy[0])
SelectObject(hMaskDC,dummy[1])
SelectObject(hBaseDC,dummy[2])
SelectObject(hCompDC,dummy[3])
DeleteDC(hTempDC)
DeleteDC(hMaskDC)
DeleteDC(hBaseDC)
DeleteDC(hCompDC)
CreateMask=hCompBmp
End Function
とりあえず、いろいろと実験したところ、
背景を黒くしたもの(hBaseDC)とマスク画像(hMaskDC)はちゃんと出来ています。
おそらく問題なのは、
BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND)
BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hBaseDC,0,0,SRCPAINT)
ここではないかと思っています。
これを処理すると、背景を黒くしたもの(hBaseDC)と同じものが出てきます。
これを透過するにはどうしたらいいのでしょうか?
ご教授お願いします。
Win.XP
AB 4.23.00
補足
引数1 に 何をいれればよいのか わかりません。。。 void CClTurnView::OnDraw(CDC* pDC) { CClTurnDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CPen Pen; CPen *pTmpPen; // 新しいペンやブラシを作るための変数です。 // クライアントの矩形領域内の中央の座標を求める。 CRect rect; GetClientRect(&rect); // 赤のペンを準備 Pen.CreatePen(PS_SOLID, 1, RGB( 255, 0, 0)); pTmpPen = pDC->SelectObject(&Pen); // X軸・Y軸を描画 pDC->MoveTo(rect.Width()/2,0); pDC->LineTo(rect.Width()/2,rect.Height() / 2*2); pDC->MoveTo(0,rect.Height() / 2); pDC->LineTo(rect.Width()/2*2,rect.Height() / 2); // 元のペンに戻す pDC->SelectObject(pTmpPen); Pen.DeleteObject(); SaveBitmap2(???????, "TEST1.BMP"); (略) }