- ベストアンサー
[Active Basic]BitBltで画像を表示
- ActiveBasicでプログラムを書いています。デバイスコンテキストが使えるようになってきて、ブロック崩しゲームを作っていますが、画像の表示がうまくいきません。
- ActiveBasicのヘルプを参考にプログラムを書いたのですが、背景が描写されていません。コードを添削していただきたいです。
- BitBltをMainWnd_Paintの中に記述すると画像が表示されますが、理由が分かりません。ご教授ください。
- みんなの回答 (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 ) といった具合にします