
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) の中に表記すると、画像が表示されます。
何故か、いまいち分かっていません・・・
すみませんが、ご教授ください。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンテキスト依存とは?
-
メモリデバイスコンテキスト&...
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
コントロールの書式設定で、“コ...
-
コンボボックス内の文字サイズ変更
-
勝手にウィンドウが開いて止ま...
-
エクセルである行が急に消えて...
-
[VB.net] DataGridViewの列ヘッ...
-
エクセルのコントロールツール...
-
TextBoxに文字を書いても表示さ...
-
皆さん、おはようございます♪ ...
-
VBAのフォント変更(エクセルか...
-
ExcelVBAでAPIを使って外部ウイ...
-
検索の画面がでなくなってしま...
-
エクセル - リストボックスのマ...
-
PBoxのGraphicsをImageに書き込む
-
コモンダイアログコントロール...
-
Vba LongPtrについて教えてくだ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
画面がチカチカする
-
VBでFD、USBの有効・無効...
-
ハードコピーをプログラムから...
-
VC++のTextOutの再描画の仕方
-
画像処理 ビットマップ ダブ...
-
WindowsAPIでの画像表示について
-
Rectangleで、リソースが解放さ...
-
メモリデバイスコンテキストを...
-
ダイアログにビットマップを貼...
-
SetWindowRgn()関数について。
-
ウインドウ内全体を一定時間で...
-
デバイスコンテキストに関して2...
-
TextOutについて
-
usbデバイスとの通信
-
メモリデバイスコンテキスト&...
-
領域を塗りつぶしたい
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
おすすめ情報