- 締切済み
ActiveBasic 複数の画像表示をしたい
ActiveBasic4.23.00を使っています。 簡単なゲームを作りたいのですが、なかなか画像の描写が出来ません。 すみませんが、以下のコードの添削をしていただけないでしょうか。 出来れば、詳しいやり方がほしいです。 (まだ、途中なので、DCの開放などはかいていない部分があります) 'デバイスコンテキスト Dim hMemDC As HDC Dim hBackDC As HDC Dim hMyDC As HDC 'ビットマップ Dim hBackBmp As HANDLE Dim hMyBmp As HANDLE Dim hMemBmp As HANDLE 'ハンドル Dim hBackHand As HANDLE Dim hMyHand As HANDLE 'プログラムの変数 Dim WhereDir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() DeleteDC(hMemDC) DeleteDC(hMyDC) Game_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) /* 作成時 */ '自分自身のファイルパスを取得 Dim dir[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,dir) WhereDir=dir 'メモリデバイスコンテキストを準備 Dim img As HDC img=GetDC(hMainWnd) hMemDC=CreateCompatibleDC(img) hBackDC=CreateCompatibleDC(img) hMyDC=CreateCompatibleDC(img) '画像をよみこむ hBackBmp=LoadImage(0,WhereDir+"\背景.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyBmp=LoadImage(0,WhereDir+"\人.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) '画像処理 hMemBmp=CreateCompatibleBitmap(img,640,480) hBackHand=CreateCompatibleBitmap(img,640,480) hMyHand=CreateCompatibleBitmap(img,40,50) SelectObject(hBackDC,hBackBmp) BitBlt(hMemDC,0,0,40,50,hBackDC,0,0,SRCCOPY) SelectObject(hMyDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) SelectObject(hMemDC,hMemBmp) ReleaseDC(hMainWnd,img) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub わかりにくいとは思いますが、お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
背景と合成したいのであれば 合成画像とそれのマスク画像が必要です ' 表示画像を読み込み HDCに選択する hMyBmp = LoadImage( ... ) ' 引数は省略 SelectObject( hMyDC, hMyBmp ) ' 左上の色を背景色として設定 SetBkColor( hMyDC, GetPixel( hMyDC, 0, 0 ) ) ' Debug用 ' BitBlt( hMemDC, 0, 0, 40, 50, hMyDC, 0, 0, SRCOPY ) ' マスク用のモノクロBMPとHDCを準備 dim hMonoDC as HDC, hMonoBmp as HBITMAP hMonoDC = CreateCompatibleDC( img ) hMonoBmp = CreateCompatibleBitmap( hMonoDC, 40, 50 ) ' 選択して白で初期化する SelectObject( hMonoDC, hMonoBmp ) PatBlt( hMonoDC, 0, 0, 40, 50, WHITENESS ) ' 表示画像の背景が黒ならこの処理は不要 --- ここから BitBlt( hMonoDC, 0, 0, 40, 50, hMyDC, 0, 0, SRCINVERT ) ' Debug用 ' BitBlt( hMemDC, 48, 0, 40, 50, hMonoDC, 0, 0, SRCOPY ) ' 表示画像のマスクを準備 Dim hMaskDC As HDC, hMaskBmp as HBITMAP hMaskDC = CreateCompatibleDC( img ) ' カラービットマップにするため 元のimgを使う hMaskBmp = CreateCompatibleBitmap( img, 40, 50 ) SelectObject( hMaskDC, hMaskBmp ) ' マスクに元画像を転送 BitBlt( hMaskDC, 0, 0, 40, 50, hMyDC, 0, 0, SRCCOPY ) ' マスクとモノクロのANDを使って背景を除去(黒にする) BitBlt( hMaskDC, 0, 0, 40, 50, hMono, 0, 0, SRCAND ) ' Debug用 ' BitBlt( hMemDC, 96, 0, 40, 50, hMaskDC, 0, 0, SRCOPY ) ' ---- ここまで 'モノクロマスクを背景用に生成 PatBlt( hMonoDC, 0, 0, 40, 50, WHITENESS ) BitBlt( hMono, 0, 0, 40, 50, hMyDC, SRCCOPY ) ' Debug用 ' BitBlt( hMemDC, 144, 0, 40, 50, hMaskDC, 0, 0, SRAND ) '出来上がったイメージを hMemDCへORモードで転送 BitBlt( hMemDC, 0, 58, 40, 50, hMono, SRCAND ) BitBlt( hMemDC, 0, 58, 40, 50, hMaskDC, 0, 0, SRCPAINT ) ' 背景が黒なら ' BitBlt( hMemDC, 0, 58, 40, 50, hMyDC, 0, 0, SRCPAINT ) といった具合です # 使い終わったオブジェクトは DeleteObjectやDeleteDCで削除しましょう # SelectObjectで選択したものは元の選択に戻してから削除したほうがいいです dim hOldBmp as HBITMAP hOldBmp = SelectObject( hMaskDC, hMaskBmp ) ' hMaskDCの処理 SelectObject( hMaskDC, hOldBmp ) DeleteObject( hMaskBmp ) DeleteDC( hMaskDC ) といった具合に ...