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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetDC()とCreateCompatibleDC()
-
画面のちらつきについて
-
ピクチャーコントロールのデバ...
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
グラフの交点の求め方(Excel)
-
フォントの大きさ
-
コントロールの書式設定で、“コ...
-
VBAのフォント変更(エクセルか...
-
コンボボックス内の文字サイズ変更
-
エクセルのコントロールツール...
-
他のウィンドウのボタンを自動...
-
vbaから他のアプリを終了
-
ドロップダウンリストのフォン...
-
DateTimePickerでに年月までし...
-
検索の画面がでなくなってしま...
-
メッセージボックスを大きくす...
-
ダイアログボックスで指定した...
-
メッセージボックスの選択ボタ...
-
VB6,リストボックスの特定行の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
ダイアログにビットマップを貼...
-
GetDC()とCreateCompatibleDC()
-
画面がチカチカする
-
C 多角形を半透明に塗る方法
-
ピクチャーコントロールのデバ...
-
Rectangleで、リソースが解放さ...
-
画像処理 ビットマップ ダブ...
-
ウインドウ内全体を一定時間で...
-
TextOutについて
-
VBでFD、USBの有効・無効...
-
メモリデバイスコンテキスト&...
-
ハードコピーをプログラムから...
-
VC++のTextOutの再描画の仕方
-
PrintScreenしたあとに画像を保...
-
SelectObjectについて
-
ダブルバッファの作り方
-
VC++でBitmapとText文字を表示...
-
Windowsプログラミング 画面描...
-
GetPixelに使うHDCの作り方
おすすめ情報