Active Basic 自動でマスク画像を制作して、画像を透過する方法
ABの4.23.00を使用しています
今回、マスク画像を自動的に作成して、ビットマップ画像を透過して表示させる方法を考えているのですが、なかなかうまくいきません。
皆さんの知識をお貸しください。
とりあえず、グローバルで変数を用意しました。
Dim hMemDC As HDC
Dim hMemBmp As HBITMAP
Dim hIconDC As HDC
Dim hIconBmp As HBITMAP
BITMAPリソースに適当な画像を入れて、クリエイトイベントで変数に読み込みました。
※ビットマップの大きさは、32*32の物を使用してみました。
Dim hDC As HDC
hDC=GetDC(hMainWnd)
hIconDC=CreateCompatibleDC(hDC)
hMemDC=CreateCompatibleDC(hDC)
hIconBmp=LoadBitmap(GetModuleHandle(0),IDB_BITMAP1)
hMemBmp=CreateCompatibleBitmap(hDC,300,300)
SelectObject(hIconDC,hIconBmp)
SelectObject(hMemDC,hMemBmp)
背景の色を指定しました
SetBkColor(hIconDC,GetPixel(hIconDC,0,0))
とりあえず、hMemDCに画像をコピーしました。
BitBlt(hMemDC,0,0,32,32,hIconDC,0,0,SRCCOPY)
ReleaseDC(hMainWnd,hDC)
次に、再描写の処理のときに、マスク画像を用意する処理を入れてみたのですが、うまくいきません。
Dim hMaskDC As HDC
Dim hMaskBmp As HBITMAP
Dim hTempDC As HDC
Dim hTempBmp As HBITMAP
hMaskDC=CreateCompatibleDC(hMemDC)
hMaskBmp=CreateBitmap(32,32,1,1,0)
SelectObject(hMaskDC,hMaskBmp)
BitBlt(hMaskDC,0,0,32,32,hIconDC,0,0,SRCCOPY)
hTempDC=CreateCompatibleDC(hDC)
hTempBmp=CreateCompatibleBitmap(hMemBmp,32,32)
SelectObject(hTempDC,hTempBmp)
BitBlt(hTempDC,0,0,32,32,hMaskDC,0,0,NOTSRCCOPY)
BitBlt(hTempDC,0,0,32,32,hIconDC,0,0,SRCAND)
BitBlt(hMemDC,0,0,32,32,hMaskDC,0,0,SRCAND)
BitBlt(hMemDC,0,0,32,32,hTempDC,0,0,SRCPAINT)
DeleteDC(hMaskDC)
DeleteObject(hMaskBmp)
DeleteDC(hTempDC)
DeleteObject(hTempBmp)
BitBlt(hDC,0,0,32,32,hMemDC,0,0,SRCCOPY)
このような感じで書いてみました
すみませんが、添削をお願いします
お礼
お返事ありがとうございます。 一つ一つの関数は返り値を調べてチェックしておりますが 特にエラーは見つかりませんでした。 ためしに一つのメモリDCに対してGDI描画関数を用いて適当な図形を 描画してみたのですが、結果は全黒のビットマップのままでした。 -----処理の流れ(完全にオフスクリーンのみの処理です) "CreateCompatibleDC"でメモリDCを作り "CreateDIBSection"でBitmapハンドルを得て "SelectObject"でメモリDCとBitmapハンドルを関連付け "polygon"等のGDI関数を用いて描画 → 結果は全黒のビットマップ ・原因としては、メモリDCの確保の仕方がまずい ・現在1bitモノクロBITMAPを用いているため CreateDIBSectionの第三引数が誤っている。 等考えられるのですが、以前はこのような書式で 描画することができました。 もし、何かご意見いただければ幸いです。 よろしくお願いします。
補足
BitBltがうまくいってないみたいなので、まずはLoadImageを使用せずに地道にビットマップファイルのヘッダを読み込んでデータを取り扱うことにしました。 どうもありがとうございました。