ab.com コミュニティ
https://www.activebasic.com/forum/

ロードしたはずのビットマップが無効になる
https://www.activebasic.com/forum/viewtopic.php?t=939
ページ 11

作成者:  ganas [ 2006年4月09日(日) 15:24 ]
記事の件名:  ロードしたはずのビットマップが無効になる

こんにちは。

ちょっと複雑なので、自分でもなかなか理解ができないのですが、次のような手順の作業を行った後、元に戻しても症状が改善しません。

※コードファイル = Basicプログラム(*.abp)

1.ダブルバッファリング用の裏画面のデバイスコンテキスト(以下DC)、ビットマップハンドル(以下HBMP)を「最初に表示されるWindowのコード内部」に宣言
コード:
Dim hDC As HDC 'GetDC(hMainWnd)の値を代入
Dim hBmp As HBITMAP 'CreateCompatibleBitmap(hDC,320,240)を割り当て
Dim hScreenDC As HDC 'CreateCompatibleDC(hDC)を割り当て

'使用している様子---
hDC = GetDC(hMainWnd)
hBmp = CreateCompatibleBitmap(hDC,SCREEN_X,SCREEN_Y)
hScreenDC = CreateCompatibleDC(hDC)
SelectObject(hScreenDC,hBmp)
'---

2.同じ場所に、ビットマップをロードするために、HBMPやDCを宣言する
コード:
Dim picLogo As HDC 'BitBltなどで使用する部分(CreateCompatibleDC(hDC)使用)
Dim bmLogo As HBITMAP 'LoadImageで画像を読み込む(簡略化のため、LoadBmp関数を自作してある(下のほうに記述))
Dim bmiLogo As BITMAP 'ビットマップヘッダー

'使用している様子 ---
' picLogo = CreateCompatibleDC(hDC)
' bmLogo = LoadBmp("dat\bmp\logo\author_logo.bmp")
' GetObject(bmLogo,sizeof(BITMAP),bmiLogo)
' SelectObject(picLogo,bmLogo)
'---

'LoadBmp関数

Function LoadBmp(fileName As String) As HBITMAP
	LoadBmp = LoadImage(NULL,StrPtr(fileName),IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
End Function

3.プログラムを、管理性の向上から、複数のファイルに分割。この時、上記の2種類の定義を、一緒に「単体のコードファイル(.abpファイル)」に記述。自作関数などは元々ウィンドウメッセージ処理のコードファイルに記述してあったため、分割しても問題ないと見て、別のコードファイルに移動。それにより、メッセージ処理部分はメッセージ処理のみ、そこに記述してあった別の関数を、上記にあった2種類の定義とは別のコードファイルに移動。

次のような感じです。(Project1がメッセージ処理のあるコードファイル、MainWndがWindowのコードファイルと仮定します。)

最初の状態:
[Project1] LoadBmp関数・・・
[MainWnd.abp] DCなどの定義。Createで読み込み、Destroyで破棄。内部に描画用のスレッドが存在

分割後:
[Project1]メッセージ処理のみ
[MainWnd.abp] Createなどのイベント定義はあるが、処理は分割したファイル(DCなどの定義があるコードファイル)から関数にて呼び出す。スレッドは[WorkThread.abp]に移動。
[MainFunc.abp]DCなどの定義。読み込みや破棄などを関数で統一。
[GeneralFunc.abp] Project1のメッセージ処理以外の処理をすべてここに定義。
[WorkThread.abp] スレッド処理


4.画像が読み込まれた(?)ようだが、描画がされない(分割前は正常)。
※ファイルパスは正常動作時のままなので問題なし

5.その後、疑いのあるコードを元に戻すが正常動作しない。


・・・簡単にまとめると以下の通りです。

1.最初は変数と読み込み、破棄の処理はWindowのプログラムに記述。
2.その後、個々のコードファイルに分割したら、正常動作しなくなる。

別のところから変数を呼び出しているせいだと思って、実験(String型のメッセージを定義したコードファイルとは別のコードファイルから、MsgBox関数でメッセージを表示)も行いましたが、まったく問題がありませんでした。

なお、問題を避けるため、ハンドルはDword型による定義を一切行っていません。

作成者:  イグトランス [ 2006年4月09日(日) 18:19 ]
記事の件名: 

まずはデバッガを使って、ビットマップをロードしたときや描画するときなど、
疑わしいときの変数の値がどうなっているか確かめてみたらどうでしょうか。

案外自分のミスだったということがあるかもしれませんよ。
#というより私がそうでした。

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/