2010/03/23(Tue) 17:00:36 編集(投稿者)
2010/03/23(Tue) 16:59:47 編集(投稿者)
<pre><pre>■No48025 (よねKEN さん) に返信
よねKENさん、お答頂きありがとうございます。
> FormAがClassB→ClassC→ClassDと辿ってClassDの文字列作成メソッドを呼び出して
> 戻り値として、文字列を取得し、FormAがそれを描画してはどうでしょう。
2つ答えを用意して頂きましたが、こちらより、
> あるいは、ClassB〜ClassDがそれぞれの描画を担当する手もあるかと思います。
> ・FormAはGraphicsオブジェクトの準備とClassBの描画の呼び出し
> ・ClassBは碁盤の描画を担当(マス以外の部分の描画とClassCの描画処理の呼び出し)
> ・ClassCは個々のマスの描画を担当(マスの部分の描画とClassDの描画処理の呼び出し)
> ・ClassDの駒の描画を担当
> 描画するにはGraphicsオブジェクトがあればよいので、それぞれの描画メソッドのパラメータにGraphicsを用意し、
> FormAで用意したGraphicsオブジェクトを渡せばよいでしょう。
恐らくこちらが正解な気がしました。
B、C、Dが何をしているか、FormAは頓着しないでいられると思いましたので。
画像処理であるGraphicsオブジェクトを各クラスで利用するのは、何かコストがかかると思い込んでいましたが、
参照型であるため、ひとつの物を色々な角度から見ているにすぎないのですよね?
解決しましたので、少し長いですがソースを載せて締めます。
Public Class Form1
Private board As New ClassB
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
'Graphicsオブジェクトの準備とClassBの描画の呼び出し
board.Paint(e.Graphics)
End Sub
Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PictureBox1.Invalidate() '便宜上タイマーで
End Sub
End Class
Public Class ClassB
Private sizeX As Integer = 9
Private sizeY As Integer = 9
Private grid(sizeX, sizeY) As ClassC
Sub New()
Dim syurui As Integer = 0
For y As Integer = 0 To sizeY - 1
For x As Integer = 0 To sizeX - 1
grid(x, y) = New ClassC(x, y, syurui)
syurui += 1
Next
Next
End Sub
Public Sub Paint(ByVal g As Graphics)
'マス以外の部分(碁盤)の描画とClassCの描画処理の呼び出し
g.FillRectangle(Brushes.Black, New Rectangle(0, 0, 100, 100))
For y As Integer = 0 To sizeY - 1
For x As Integer = 0 To sizeX - 1
grid(x, y).Paint(g)
Next
Next
End Sub
End Class
Public Class ClassC
Private koma As New ClassD
Public X As Integer 'X座標位置
Public Y As Integer 'Y座標位置
Public Syurui As Integer 'こまの種類
Sub New(ByVal x As Integer, ByVal y As Integer, ByVal syurui As Integer)
Me.X = x * 10 + 5
Me.Y = y * 10 + 5
Me.Syurui = syurui
End Sub
Public Sub Paint(ByVal g As Graphics)
'マスの部分の描画とClassDの描画処理の呼び出し
g.FillRectangle(Brushes.Khaki, New Rectangle(X, Y, 9, 9))
koma.Paint(g, Me)
End Sub
End Class
Public Class ClassD
Dim number As Integer = 0
Dim font As New Font(FontFamily.GenericSerif, 5)
Public Sub Paint(ByVal g As Graphics, ByVal classC As ClassC)
'駒の描画を担当
g.DrawString(classC.Syurui.ToString, font, Brushes.Black, classC.X, classC.Y)
classC.Syurui += 1
If classC.Syurui > 100 Then classC.Syurui = 0
End Sub
End Class