画面に多数の四角形を描くには?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ゲスト

画面に多数の四角形を描くには?

#1 投稿記事 by ゲスト »

初めまして、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: 画面に多数の四角形を描くには?

#2 投稿記事 by ゲスト »

ttp://www.activebasic.com/help_center/article ... index.html

背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
講座位見ましょう

余談ですが、自分で作成した物は大体放棄しなければいけないので
CreateSolidBrushはDeleteObjectで放棄する必要があります
再描画毎に作り続けてすごいことになってませんかこれ
ゲスト(質問者)

Re: 画面に多数の四角形を描くには?

#3 投稿記事 by ゲスト(質問者) »

 アドバイスありがとうございました。
 Object放棄の件、ご指摘の通りです。早速修正しました。この部分を修正した
ところ、問題が解決しました。原因は、Brushオブジェクトが大量に作られ、配列用の
領域が壊されていたようです。

 私の題名・質問の書き方が悪かったためか、余分に問題を考慮していただくことに
なってしまって申し訳ありませでした。「Windowにまったく描けない」のではなく、
「何度かは期待通りに描くが、決まった回数描くとダメになる」と書けば良かったです
ね。
 ご指摘の講座は、既に一応読んでました。講座の見本と違う書き方をしているのは、
Activebasicの動きを一歩ずつ理解しようと試しているからなのです。これも書いて
おけば良かったですね。
 講座のサンプルでは、メモリー上(DCとして扱う)で画像を合成し、最終的には
WindowのDCを取得して描画している(一種のダブルバッファ動作)、と理解しました
(間違った理解でしょうか?)。それ故、直接WindowのDCを取得して描けば、
とりあえず動作チェックになると思って省略していました。誤解させてすみませんでした。

 色々と、お手数をおかけしました。ありがとうございました。


> ttp://www.activebasic.com/help_center/article ... index.html
>
> 背景色で塗りつぶされるので、デバイスコンテキストに描画しないと…
> 講座位見ましょう
>
> 余談ですが、自分で作成した物は大体放棄しなければいけないので
> CreateSolidBrushはDeleteObjectで放棄する必要があります
> 再描画毎に作り続けてすごいことになってませんかこれ
返信する