初めまして、Activebaseicの学習用にライフゲームを作ろうとしています。
ActivebasicでWindowsのプログラムをするのは初めてです。
グローバル変数に50x50の配列を用意して、この中にセルの状態値を書き込み、
描画の際に配列の中身を読んで、ウインドウ上に四角を描くようにしたいのです。
試しにボタンクリックごとに、乱数を配列に書き込んで描画することを繰り返しさせた
ところ四回目の書き込みから、指定外の色(白)で描画が起きてしまいます。
何が悪いのでしょうか?アドバイスよろしくお願いします。
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
dim hDC As DWord
const ScreenLeft = 10
const ScreenTop = 10
const ScreenWidthNum = 49
const ScreenHeightNum = 49
const cellSize = 10
dim cells[ScreenWidthNum, ScreenHeightNum] As Integer
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
life_game_DestroyObjects()
PostQuitMessage(0)
End Sub
'初期化コード 配列とスレッド、デバイスコンテキストの取得など
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
dim i As Integer
dim j As Integer
For i = 0 to (ScreenWidthNum)
For j = 0 to (ScreenHeightNum)
cells[i, j] = 0
Next j
Next i
End Sub
Sub makeRandom()
dim i As Integer
dim j As Integer
Randomize
For i = 0 to (ScreenWidthNum)
For j = 0 to (ScreenHeightNum)
cells[i, j] = Rnd() * 2
Next j
Next i
End Sub
Sub MainWnd_CommandButtonStart_Click()
makeRandom()
InvalidateRect(hMainWnd, ByVal 0, 0)
End Sub
Sub MainWnd_Paint(hDC As HDC)
dim hBrush As DWord
dim cell As RECT
dim i As Integer
dim j As Integer
dim hWDC As HDC
hWDC =GetDC(hMainWnd)
For i = 0 to (ScreenWidthNum)
For j = 0 to (ScreenHeightNum)
If cells[i,j] = 1 Then
'生きてたら緑
hBrush = CreateSolidBrush(RGB(0, 255, 0))
Else
'死んでたら黒
hBrush = CreateSolidBrush(RGB(0, 0, 0))
End If
cell.left = i * cellSize + ScreenLeft
cell.top = j * cellSize + ScreenTop
cell.right = (i + 1) * cellSize + ScreenLeft
cell.bottom = (j + 1) * cellSize + ScreenTop
FillRect(hWDC, cell, hBrush)
Next j
Next i
ReleaseDC(hWDC, hMainWnd)
End Sub
画面に多数の四角形を描くには?
Re: 画面に多数の四角形を描くには?
ttp://www.activebasic.com/help_center/article ... index.html
背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
講座位見ましょう
余談ですが、自分で作成した物は大体放棄しなければいけないので
CreateSolidBrushはDeleteObjectで放棄する必要があります
再描画毎に作り続けてすごいことになってませんかこれ
背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
講座位見ましょう
余談ですが、自分で作成した物は大体放棄しなければいけないので
CreateSolidBrushはDeleteObjectで放棄する必要があります
再描画毎に作り続けてすごいことになってませんかこれ
Re: 画面に多数の四角形を描くには?
アドバイスありがとうございました。
Object放棄の件、ご指摘の通りです。早速修正しました。この部分を修正した
ところ、問題が解決しました。原因は、Brushオブジェクトが大量に作られ、配列用の
領域が壊されていたようです。
私の題名・質問の書き方が悪かったためか、余分に問題を考慮していただくことに
なってしまって申し訳ありませでした。「Windowにまったく描けない」のではなく、
「何度かは期待通りに描くが、決まった回数描くとダメになる」と書けば良かったです
ね。
ご指摘の講座は、既に一応読んでました。講座の見本と違う書き方をしているのは、
Activebasicの動きを一歩ずつ理解しようと試しているからなのです。これも書いて
おけば良かったですね。
講座のサンプルでは、メモリー上(DCとして扱う)で画像を合成し、最終的には
WindowのDCを取得して描画している(一種のダブルバッファ動作)、と理解しました
(間違った理解でしょうか?)。それ故、直接WindowのDCを取得して描けば、
とりあえず動作チェックになると思って省略していました。誤解させてすみませんでした。
色々と、お手数をおかけしました。ありがとうございました。
> ttp://www.activebasic.com/help_center/article ... index.html
>
> 背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
> 講座位見ましょう
>
> 余談ですが、自分で作成した物は大体放棄しなければいけないので
> CreateSolidBrushはDeleteObjectで放棄する必要があります
> 再描画毎に作り続けてすごいことになってませんかこれ
Object放棄の件、ご指摘の通りです。早速修正しました。この部分を修正した
ところ、問題が解決しました。原因は、Brushオブジェクトが大量に作られ、配列用の
領域が壊されていたようです。
私の題名・質問の書き方が悪かったためか、余分に問題を考慮していただくことに
なってしまって申し訳ありませでした。「Windowにまったく描けない」のではなく、
「何度かは期待通りに描くが、決まった回数描くとダメになる」と書けば良かったです
ね。
ご指摘の講座は、既に一応読んでました。講座の見本と違う書き方をしているのは、
Activebasicの動きを一歩ずつ理解しようと試しているからなのです。これも書いて
おけば良かったですね。
講座のサンプルでは、メモリー上(DCとして扱う)で画像を合成し、最終的には
WindowのDCを取得して描画している(一種のダブルバッファ動作)、と理解しました
(間違った理解でしょうか?)。それ故、直接WindowのDCを取得して描けば、
とりあえず動作チェックになると思って省略していました。誤解させてすみませんでした。
色々と、お手数をおかけしました。ありがとうございました。
> ttp://www.activebasic.com/help_center/article ... index.html
>
> 背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
> 講座位見ましょう
>
> 余談ですが、自分で作成した物は大体放棄しなければいけないので
> CreateSolidBrushはDeleteObjectで放棄する必要があります
> 再描画毎に作り続けてすごいことになってませんかこれ