ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 04:49

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - ロードしたはずのビットマップが無効になる
作成者 メッセージ
  記事の件名:   引用付きで返信する
まずはデバッガを使って、ビットマップをロードしたときや描画するときなど、
疑わしいときの変数の値がどうなっているか確かめてみたらどうでしょうか。

案外自分のミスだったということがあるかもしれませんよ。
#というより私がそうでした。
投稿記事 Posted: 2006年4月09日(日) 18:19
  記事の件名:  ロードしたはずのビットマップが無効になる  引用付きで返信する
こんにちは。

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

※コードファイル = 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型による定義を一切行っていません。
投稿記事 Posted: 2006年4月09日(日) 15:24

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean