
ゲームを作っています。
そのときに、背景を透過した画像を作る関数を書いたのですが、どうしてもうまく処理が出来ません。
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
No.1ベストアンサー
- 回答日時:
HBITMAPには透明色がありません。
以下の行ではデフォルトの黒で塗りつぶされたビットマップが作成されています。
hCompBmp=CreateCompatibleBitmap(hDC,bmp.bmWidth,bmp.bmHeight)
そのうえで、キチンと透過処理をしてhCompDCにキャラクタを描画しています。
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)と同じ、意味ねぇ!!って事ですね。
最終的に捨ててしまっている、hMaskDCとhBaseDCを保存しておいて、キャラクタを表示したい場面でラスタオペレーションで透過処理をするべきですかね。
http://zahyou.hp.infoseek.co.jp/cgame/transparen …
http://homepage1.nifty.com/CavalierLab/lab/win/t …
最初から対象OSをWindows2000以降限定にして、TransparentBltを使うとか。
http://msdn.microsoft.com/ja-jp/library/cc428776 …
※何をしているかソースコード内にコメント入れましょうよ。
ご回答ありがとうございます。
コメントの件、すいません。
テストで作っていたもので、コメントをいれずにやっていました。
申し訳ないです。
>HBITMAPには透明色がありません。
>最終的に捨ててしまっている、hMaskDCとhBaseDCを保存しておいて、
>キャラクタを表示したい場面でラスタオペレーションで透過処理をするべきですかね。
ということは、やはり、透過したものを確保しておくのは無理ですか・・・
マスク作って、合成して行くしかないですかね・・・
No.2
- 回答日時:
>マスク作って、合成して行くしかないですかね・・・
私個人は、VB2の頃からのVBプログラマなんでマスク作ってラスタオペレーションを使って、自前ですべての描画処理ってのは好きなんですけど、やっぱ今の主流で言えばゲーム作るならDirectXじゃないですかね?
それならマスク作る必要ないですし、簡単に全画面表示に切り替えられますし。
ジョイパッド(ジョイスティック)に対応することも簡単。
描画も早いですし。
事実上のゲーム用のライブラリとしてせっかく用意されているのだから、使わにゃ損って感じですかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 英語 Thus, PTH may be used to promote bone regeneration 1 2022/07/26 08:15
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ハードコピーをプログラムから...
-
SetWindowRgn()関数について。
-
メモリデバイスコンテキスト&...
-
GetPixelに使うHDCの作り方
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
グラフの交点の求め方(Excel)
-
Minecraft 統合版(PC)の描画距...
-
SetWindowText関数について
-
VBAのフォント変更(エクセルか...
-
TextBoxに文字を書いても表示さ...
-
【C#】別フォームも同時に閉じ...
-
コンボボックス内の文字サイズ変更
-
matlab-図形表示
-
エクセルである行が急に消えて...
-
フォームでPDFを表示させた...
-
勝手にウィンドウが開いて止ま...
-
多角形の内部かどうか判定する方法
-
エディットボックスのフォント...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
PlgBltでの透過
-
OpenGLでウィンドウハンドルの取得
-
メモリデバイスコンテキストを...
-
GetDC()とCreateCompatibleDC()
-
ちらつきについて
-
VBでFD、USBの有効・無効...
-
Active Basic デバイスコンテ...
-
ExtTextOut
-
デバイスコンテキストとデバイ...
-
VC++のTextOutの再描画の仕方
-
画面がチカチカする
-
ハードコピーをプログラムから...
-
メモリデバイスコンテキスト&...
-
C++でBMP解析
-
C 多角形を半透明に塗る方法
-
領域を塗りつぶしたい
-
コントロール内の文字の背景色
-
GetPixelに使うHDCの作り方
-
丸いボタンの表示でCPU100%
おすすめ情報