• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[Active Basic]BitBltで画像を表示)

[Active Basic]BitBltで画像を表示

このQ&Aのポイント
  • ActiveBasicでプログラムを書いています。デバイスコンテキストが使えるようになってきて、ブロック崩しゲームを作っていますが、画像の表示がうまくいきません。
  • ActiveBasicのヘルプを参考にプログラムを書いたのですが、背景が描写されていません。コードを添削していただきたいです。
  • BitBltをMainWnd_Paintの中に記述すると画像が表示されますが、理由が分かりません。ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

まず hMemDC用のビットマップが必要です dim hMemBmp as HBITMAP といったグローバル変数を用意します MainWnd_Createの hMemDC = CreateCompatibleDC(hDC)'BitBlt用DC のあとぐらいで dim bmp as Bitmap GetObject( ImgBack, Len( bmp ), bmp ) hMemBmp = CreateCompatibleBitmap( hDC, bmp.bmWidth, bmp.bmHeight) SelectObject( hMemDC, hMemBmp ) といった具合にします 次に グローバル変数に dim myRC as RECT を定義します MainWndProcの TODO:の次の行に if wMsg = WM_PAINT then   ' 更新が必要な領域の取得   GetUpdateRect( hWnd, myRC, 1 ) end if を記述します MainWnd_Paintの中身は dim x as long, y as long dim w as long, h as long dim rc as RECT ' 更新領域の変数への格納 x = myRC.left y = myRC.top w = myRC.right - x h = myRC.bottom - y if w = 0 then   ' 幅が0の場合はクライアント領域の幅にする   GetClientRect( hMainWnd, rc )   w = rc.right - x end if if h = 0 then   ' 高さが0の場合はクライアント領域の高さにする   GetClientRect( hMainWnd, rc )   h = rc.bottom - y end if BitBlt( hDC, x, y, w, h, hMemDC, x, y, SRCCOPY ) といった具合にします 特定の範囲の再描画には hMemDCに対して描画をしておいて dim rc as RECT rc.left = 左上のX座標 rc.right = 右下のX座標 rc.top = 左上のY座標 rc.bottom = 右下のY座標 InvalidateRect( hMainWnd, rc, 1 ) または InvalidateRect( hMainWnd, rc, 0 ) といった具合にします クライアント領域全体を再描画するならば InvalidateRect( hMainWnd, ByVal 0 , 1 ) といった具合にします

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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 わかりにくいとは思いますが、お願いします。

  • Active Basic 画像表示 添削願い

    AB4.23.00を使っています。 複数画像を表示しようと頑張っているのですが、どうやっても出来ません。 すみませんが、コードの添削の方をお願いします。 '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 /*全体*/ Dim hMemDC As HDC /*背景*/ Dim hBackDC As HDC Dim hBackBmp As HBITMAP /*自機*/ Dim hMyDC As HDC Dim hMyBmp As HBITMAP /*プログラムの設定など*/ Dim Dir 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() stg_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC Dim OldBmp As HBITMAP SetWindowText(hMainWnd,"しゅーてぃんぐ") 'ディレクトリ取得 Dim path[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,path) Dir=path 'MainWndのDC取得 hDC=GetDC(hMainWnd) '全体DCメモリ作成 hMemDC=CreateCompatibleDC(hDC) '背景 hBackBmp=LoadImage(0,back.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hBackDC=CreateCompatibleDC(hDC) 'キャラクター hMyBmp=LoadImage(0,A.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyDC=CreateCompatibleDC(hBackDC) '描写 SelectObject(hMemDC,hBackBmp) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) SelectObject(hMemDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub back.bmpの上にA.bmpを描写したいです。 透過処理などはいらないので、どうすれば表示することが出来るかを教えてください。 今は、どちらか片一方しか表示されません。 また、 http://www.geocities.jp/debu0510/basic/main17.html を参考にさせていただいたのですが、CreateCompatibleBitmap関数の使い方が分かりません。 これは、どのようにして使用するのでしょうか。 こちらもご教授お願いします。

  • 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) このような感じで書いてみました すみませんが、添削をお願いします

  • ActiveBasic 再描写処理が読み出されても、描写していた物を削除しない方法

    ActiveBasic4.23.00を使ってプログラムを書いています。 例えば、次のようなコードがあったとします。 'グローバル Dim DragFlag As Long Dim hDC As HDC '此処まで Sub MainWnd_Destroy() ReleaseDC(hMainWnd,hDC) test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) hDC = GetDC(hMainWnd) End Sub Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) DragFlag = 1 MoveToEx(hDC,x,y,ByVal NULL) End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If DragFlag = 0 Then Exit Sub LineTo(hDC,x,y) End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) DragFlag = 0 End Sub (ABWiki様を参考にさせていただきました。) これで、簡単なお絵かきが出来ますが、再描写(例えば、ウインドウの大きさを変えるなど)をするとすべて消えてしまいます。 これを、描いた線を消さずに再描写することは出来ないのでしょうか。 すみませんがご教授ください。

  • Active Basic 画像の透過処理

    AB4.23.00を使っています。 簡単なゲームを作ろうと思って作成を進めているのですが、 画像を透過する処理でつまずいてしまいました。 Sub ShowPictures() /*ピクチャを描写する*/ Dim n As Long Dim hDC As HDC Dim hMyMaskDC As HDC '自機マスク用 Dim hMyMaskBmp As HBITMAP '自機マスク用 Dim hMyTempDC As DWord Dim hMyTempBmp As DWord hDC=GetDC(hMainWnd) '背景 BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) '敵画像 For n=0 to 100 Step 1 BitBlt(hMemDC,ex[n],ey[n],30,30,hEneDC[n],0,0,SRCCOPY) Next '自機描写 hMyMaskDC=CreateCompatibleDC(hDC) hMyMaskBmp=CreateBitmap(40,50,1,1,0) SelectObject(hMyMaskDC,hMyMaskBmp) BitBlt(hMyMaskDC,0,0,x,y,hMyDC,0,0,SRCCOPY) hMyTempDC=CreateCompatibleDC(hDC) hMyTempBmp=CreateCompatibleBitmap(hDC,40,50) SelectObject(hMyTempDC,hMyTempBmp) BitBlt(hMyTempDC,0,0,x,y,hMyMaskDC,0,0,NOTSRCCOPY) 'BitBlt(hMyTempDC,0,0,x,y,hMyDC,x,y,SRCAND) 'キャラクタ画像をOR転送 BitBlt(hMemDC,0,0,x,y,hMyTempDC,0,0,SRCPAINT) 'マスク画像をAND転送 BitBlt(hMemDC,0,0,x,y,hMyMaskDC,0,0,SRCAND) 'マスク用画像をメモリから解放 DeleteDC(hMyMaskDC) DeleteObject(hMyMaskBmp) 'キャラクタの一時画像をメモリから解放 DeleteDC(hMyTempDC) DeleteObject(hMyTempBmp) InvalidateRect(hMainWnd,ByVal 0,FALSE) DeleteObject(hMyMaskBmp) DeleteDC(hMyMaskDC) End Sub 描写処理のルーチンです。 これを実行すると、黒い塊になってしまいます。 どのように書けば、ちゃんと表示できるようになるのでしょうか。 すみませんが、ご教授をお願いします。

  • Active Basic 再描写処理

    最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。 『←』が押されれば、棒人間を左に、『→』が押されれば、棒人間を右に移動させる処理と、ランダムで●が上から落ちてくるという処理をタイマーを使ってやってみました。(スレッドとかはまだ勉強していないので) 一応完成はしたのですが、棒人間を動かすと、どうしても●がちらつきます。 この場合は、どういう風に処理をすればいいのでしょうか? プログラムはこう書きました。 グローバル変数 Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND Dim hMemDC As HDC Dim BmpInfo As Long Dim hBomDC As HWND Dim Bomxy As RECT Dim x As Long Dim y As Long Dim bx As Long Dim by As Long Dim n As Long '---------------------------------------------------- 省略 '----------------------------------------------------- Sub MainWnd_Destroy() DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) YokeGame_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetWindowText(hMainWnd,"画像描写テスト ~爆弾的なものを避けるゲーム~") hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) GetWindowRect(hBmp04,Bomxy) If hBmp01=0 or hBmp02=0 or hBmp03=0 or hBmp04=0 Then MessageBox(hMainWnd,Ex"画像の読み込みに失敗しました\r\n強制終了します。","Error",MB_OK or MB_ICONHAND) DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) SendMessage(hMainWnd,WM_CLOSE,0,0) End If x=290 y=275 BmpInfo=1 bx = 320 by = 0 SetTimer(hMainWnd,0,300,0) End Sub Sub Kettei() Dim ok As Long by=0 Do Randomize bx = Fix(Rnd()*100) If bx>0 and 630>bx Then ok=TRUE End If Loop Until ok=TRUE End Sub Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hMemDC,hBmp01) BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hBomDC,hBmp04) BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) DeleteDC(hMemDC) DeleteDC(hBomDC) BmpInfo = 1 End Sub Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode = 37 Then If x<=0 Then x=0 Exit Sub End If x = x - 10 BmpInfo=3 End If If KeyCode = 39 Then If x>=600 Then x = 600 Exit Sub End If x = x + 10 BmpInfo=2 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub Sub MainWnd_Timer(TimerID As DWord) If TimerID = 0 Then by = by + 10 InvalidateRect(hMainWnd,Byval 0,TRUE) If by >=360 Then Kettei() End If End If End Sub っと、このようになりました。(一応動きます) strictには、チェックを入れていません。 バージョンは、4.23.00を使っています。 それと、InvalidateRect関数なのですが、 InvalidateRect(hMainWnd,Byval 0,TRUE) の、二つ目のパラメータ(?)部分に、全体を再描写させるときに何故『Byval 0』と表記するのでしょうか? ヘルプには、NULL を指定すると、クライアント領域全体が更新領域に設定されますと書かれていますが、NULLを指定すると無効な識別となります。 すみませんが、分かる方がいらっしゃいましたら、ご教授をお願いします。

  • BitBltについて。

    どなたか経験のある方、わかる方居られましたら教えてください。 プリンタのデバイスコンテキストからメモリDCに描画してビットマップを作成したいと思っているのですが、プリンタDCからメモリDCへのBitBltがうまくいっていないのか、完成イメージが真っ黒になります。 hMemDC = CreateCompatibleDC(hPrinterDC); hBitmap = CreateCompatibleBitmap(hPrinterDC,lnWidth,lnHeight); Obj = (HBITMAP)SelectObject(hMemDC,hBitmap); iRet = GetDeviceCaps(hMemDC,RASTERCAPS); // iRet の戻り値は 28313(10進)でした。 // コピー iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,hPrinterDC,0,0,SRCCOPY); // iRet の戻り値は 1 になってました。 本来は lnHeight の値が BitBlt の戻り値になるのかと思いますがうまくいきません。 hPrinterDC はもともと印刷用の関数で使用しているものなので、そこには問題が無いのではないかと自分では思っていますが、わかる方居られましたら教えていただけませんでしょうか?

  • Active Basic Paintイベントを通らずに再描写

    Active Basicでゲームを作っています。 最終目標は『東方』のような弾幕避けシューティングです。 スレッドを何とか勉強して、ちらつきも抑えようと頑張っています。 このとき、画像を描写する場合には、 InvalidateRect(hMainWnd, ByVal 0, TRUE) を使って最描写を連続して繰り返してきました。 しかし、これを繰り返すと、『プレイヤー』『弾』『敵』を何度も連続して再描写するため、どうしてもちらついてしまいます。 この、『プレイヤー』『弾』『敵』を別々に描写するとちらつき現象はなくなると思うのですが、どうしてもやり方がわかりません。 InvalidateRect(hMainWnd, ByVal 0, TRUE)を使うと、結局Paintイベントが呼び出されるため、Sub MainWnd_Paint(hDC As HDC)の中に『プレイヤー』『弾』『敵』の描写処理を書いて、 プレイヤー描写、弾(約50個)のループ描写、敵のループ描写が一度にまとめて描写されてしまいます。 これらを別々に表示させるにはどうすればいいのでしょうか? すみませんが、出来るだけやさしくご教授ください。 お願いします。

  • 透過済み画像を作りたい

    プログラムを始めたところの初心者です。 画像を透過し、ウインドウに表示させたいので、いろいろ探してみたところ、 マスクを自動で作成すると言う物があったので、参考にさせてもらいました。 さらに、その中に、『同じように透過済み画像を作れる』とあったので、いろいろ試したのですが、ダメでした・・・ よろしければ、やり方を教えていただけないでしょうか。 http://oshiete1.goo.ne.jp/qa5254128.html 上を参考にさせていただきました Dim hDC as HDC, hTemp As HDC, hDest as HDC,hOriDC As HDC Dim hBmpTemp as HBITMAP, dummy(3) as HBITMAP,hOriBmp As HBITMAP Dim bmp as BITMAP Dim hMemDC As HDC,hMemBmp As HBITMAP hDC=GetDC(NULL) hTemp=CreateCompatibleDC(hDC) hDest=CreateCompatibleDC(hDC) hOriDC=CreateCompatibleDC(hDC) hMemDC=CreateCompatibleDC(hDC) ReleaseDC(NULL,hDC) ' 元画像の情報の取得 GetObject(hBmp,Len(bmp),bmp) ' モノクロBITMAPの生成 hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight) hOriBmp=CreateCompatibleBitmap(hOriDC,bmp.bmWidth,bmp.bmHeight) hMemBmp=hBmp dummy(0)=SelectObject(hTemp,hBmp) dummy(1)=SelectObject(hDest,hBmpTemp) dummy(2)=SelectObject(hOriDC,hOriBmp) dummy(3)=SelectObject(hMemDC,hMemBmp) SetBkColor(hTemp,GetPixel(hTemp,0,0)) ' 背景マスクの生成 BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY) 'スプライト BitBlt(hOriDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY) BitBlt(hOriDC,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCAND) '透過 BitBlt(hMemDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,SRCAND) BitBlt(hMemDC,0,0,bmp.bmWidth,bmp.bmHeight,hOriDC,0,0,SRCPAINT) ' HBITMAPの切り離し SelectObject(hTemp,dummy(0)) SelectObject(hDest,dummy(1)) SelectObject(hOriDC,dummy(2)) SelectObject(hMemDC,dummy(2)) ' HDCの後始末 DeleteDC(hTemp) DeleteDC(hDest) DeleteDC(hOriDC) DeleteDC(hMemDC) ' 呼び出し元への返り値 MakeMaskWith=hMemBmp

  • 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

長尺ロールの円筒研磨について
このQ&Aのポイント
  • 長尺ロールの研磨について
  • 結合度の低い砥石と結合度の高い砥石の違いと問題点
  • 長尺ロールの研磨における重要な要素とは
回答を見る

専門家に質問してみよう