アプリ版:「スタンプのみでお礼する」機能のリリースについて

ActiveBasicでプログラムを書いています。
少しずつデバイスコンテキストが使えるようになってきて、簡単なブロック崩しを作ってみようと思い、作り始めました。

以前、デバイスコンテキストを使えるようになろうと、上から物体が降ってきて、それを避けるというゲームを書いてみたのですが、画像(ビットマップ)の表示方法が分からず、すべて MainWnd_Paint(hDC As HDC) に中に書きました。
すると、処理ごとにいらないものまで描写されるので画面がかなりちらついてしまいました。

ActiveBasicのヘルプ(http://www.activebasic.com/help_center/articles/ …)を参考にして、プログラムを書いてみたのですが、背景が描写されません。
コードを下に書きますので、すみませんが添削の方をお願いします。
まだ、プログラムを始めたばかりのほやほやですので、なるべくやさしくお願いします。

'------------グローバル------------
Dim ImgBack As HBITMAP'背景画像
Dim hBackDC As HDC'背景画像用デバイスコンテキスト
Dim hMemDC As HDC'BitBlt用のデバイスコンテキスト
'------------グローバル------------


Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hDC As HDC

'イメージを読み込んでいく
ImgBack = LoadImage(0,".\pic\back.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)

'デバイスコンテキストをそれぞれ作成
hDC = GetDC(hMainWnd)
hBackDC = CreateCompatibleDC(hDC)'背景用DC
hMemDC = CreateCompatibleDC(hDC)'BitBlt用DC

'背景を描写
SelectObject(hBackDC,ImgBack)
BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY)

'最後にhDCだけ開放
ReleaseDC(hMainWnd,hDC)

End Sub


Sub MainWnd_Paint(hDC As HDC)
End Sub

後、BitBltを MainWnd_Paint(hDC As HDC) の中に表記すると、画像が表示されます。
何故か、いまいち分かっていません・・・

すみませんが、ご教授ください。

A 回答 (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 )
といった具合にします
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!