前回はの質問ではKeyPress、KeyDownについて教えていただき、使い方を調べました。
また、FormのKeyPreviewはTrueにしております。
デバックで確認したところ、
VB
1'CellStatusによって表示を変更 2 Select Case Me.Status 3 Case CellStatus._1 4 g.DrawString(1, fnt, Brushes.Orange, 0, 0) 5 Case CellStatus._2 6 g.DrawString(2, fnt, Brushes.Black, 0, 0) 7 Case CellStatus._3 8 g.DrawString(3, fnt, Brushes.Black, 0, 0) 9 Case CellStatus._4 10 g.DrawString(4, fnt, Brushes.Black, 0, 0) 11 Case CellStatus._5 12 g.DrawString(5, fnt, Brushes.Black, 0, 0) 13 Case CellStatus._6 14 g.DrawString(6, fnt, Brushes.Black, 0, 0) 15 Case CellStatus._7 16 g.DrawString(7, fnt, Brushes.Black, 0, 0) 17 Case CellStatus._8 18 g.DrawString(8, fnt, Brushes.Black, 0, 0) 19 Case CellStatus._9 20 g.DrawString(9, fnt, Brushes.Black, 0, 0) 21 Case CellStatus.Nothing 22 g.DrawString(777, fnt, Brushes.Black, 0, 0) 23 End Select
こちらのコードでうまく数字を読み込めていなさそうです。
KeyDownのイベントは発生しておりますが、Case文がうまく働いていない状態です。
その二つを用いて、コーディングを行ったのですが、うまく動作せず、なぜそうなるのかわからない現状です。
実際のゲーム画面はこちらです。
Formの上にPictureboxを配置し、Graphicsを用いて表を作成しています。
セルがオレンジで囲まれているのは、Pictureboxのクリックイベントにより、フォーカスがあるセルに着色しています。
今できずに悩んでいることは、picturebox内のセルに対し、文字の入力を行う処理です。
やりたいことは下記のとおりです。
1、フォーカスのある座標で数字のみを入力する
2、入力されたキー情報を受け取り、列挙体のステータスを与える(※下記の参照コード2)
3、Drowメソッドで
出力に関しては、
Graphics.DrawStringメソッドorTextRenderer.DrawTextメソッドを用いることで実現できるのかな、と考えておりますが、座標の指定がうまくできていないのかなと考えております。
参照コード1(Form1 Class)
VB
1Public Class Form1 2 Dim S As New source 3 4 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 5 Me.KeyPreview = True 6 End Sub 7 8 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint 9 10 S.Draw(e.Graphics) 11 12 End Sub 13 14 Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click 15 16 'マウスの座標をPictureBox1のコントロール座標に変換する。 17 Dim Pos As Point = PictureBox1.PointToClient(Windows.Forms.Cursor.Position) 18 19 S.CellFromPoint(Pos.X, Pos.Y).Focus() 20 21 PictureBox1.Invalidate() 22 23 End Sub 24 25 Private Sub PictureBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles PictureBox1.KeyPress 26 27 If "0"c <= e.KeyChar And e.KeyChar <= "9"c Then 28 e.Handled = True 29 End If 30 31 End Sub 32 33 Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 34 Dim Pos As Point = PictureBox1.PointToClient(Windows.Forms.Cursor.Position) 35 Select Case e.KeyCode 36 Case Keys.D1 Or Keys.NumPad1 37 S.Cells(Pos.X, Pos.Y).Status = CellStatus._1 38 Case Keys.D2 Or Keys.NumPad2 39 S.Cells(Pos.X, Pos.Y).Status = CellStatus._2 40 Case Keys.D3 Or Keys.NumPad3 41 S.Cells(Pos.X, Pos.Y).Status = CellStatus._3 42 Case Keys.D4 Or Keys.NumPad4 43 S.Cells(Pos.X, Pos.Y).Status = CellStatus._4 44 Case Keys.D5 Or Keys.NumPad5 45 S.Cells(Pos.X, Pos.Y).Status = CellStatus._5 46 Case Keys.D6 Or Keys.NumPad6 47 S.Cells(Pos.X, Pos.Y).Status = CellStatus._6 48 Case Keys.D7 Or Keys.NumPad7 49 S.Cells(Pos.X, Pos.Y).Status = CellStatus._7 50 Case Keys.D8 Or Keys.NumPad8 51 S.Cells(Pos.X, Pos.Y).Status = CellStatus._8 52 Case Keys.D9 Or Keys.NumPad9 53 S.Cells(Pos.X, Pos.Y).Status = CellStatus._9 54 End Select 55 PictureBox1.Invalidate() 56 End Sub 57End Class
参照コード2(Contants Class)
VB
1 2Public Enum CellStatus 3 [Nothing] 'なし 4 _1 '1 5 _2 '2 6 _3 '3 7 _4 '4 8 _5 '5 9 _6 '6 10 _7 '7 11 _8 '8 12 _9 '9 13End Enum
参照コード3(source Class)
VB
1Public Class source 2 3 Public Const CellSize As Integer = 50 'セルのサイズ 4 Public Const XCount As Integer = 9 '盤の横方向のセル数 5 Public Const YCount As Integer = 9 '盤の縦方向のセル数 6 Dim aCell(XCount - 1, YCount - 1) As Cell '全セルを表す配列 7 8 Public Sub New() 9 10 Dim X As Integer 11 Dim Y As Integer 12 13 For X = 0 To XCount - 1 14 For Y = 0 To YCount - 1 15 aCell(X, Y) = New Cell(Me, New Point(X, Y)) 16 Next 17 Next 18 19 End Sub 20 21 Public Sub Draw(ByVal g As Graphics) 22 23 Dim X As Integer 24 Dim Y As Integer 25 Dim aPen As New Pen(Color.Gray, 2) 26 Dim bPen As New Pen(Color.Black, 3) 27 28 '四角形 29 g.FillRectangle(Brushes.White, 0, 0, XCount * CellSize, YCount * CellSize) 30 31 '縦線 32 For X = 0 To XCount 33 If X Mod 3 = 0 Then 34 g.DrawLine(bPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 35 Else 36 g.DrawLine(aPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 37 End If 38 39 Next 40 41 '横線 42 For Y = 0 To YCount 43 If Y Mod 3 = 0 Then 44 g.DrawLine(bPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 45 Else 46 g.DrawLine(aPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 47 End If 48 49 Next 50 51 For Y = 0 To YCount - 1 52 For X = -0 To XCount - 1 53 Cells(X, Y).Draw(g) 54 Next 55 Next 56 End Sub 57 58 Public Property Cells(ByVal X As Integer, ByVal Y As Integer) As Cell 59 Get 60 Return aCell(X, Y) 61 End Get 62 Set(ByVal value As Cell) 63 aCell(X, Y) = value 64 End Set 65 End Property 66 67 Public Function CellFromPoint(ByVal X As Integer, ByVal Y As Integer) As Cell 68 69 Dim ThisCell As Cell 70 71 If X < 0 OrElse X >= XCount * CellSize Then 72 Return Nothing 73 End If 74 75 If Y < 0 OrElse Y >= YCount * CellSize Then 76 Return Nothing 77 End If 78 79 ThisCell = Cells(X \ CellSize, Y \ CellSize) 80 81 Return ThisCell 82 83 End Function 84 85End Class
参照コード4(Cell Class)
VB
1Public Class Cell 2 Public Status As CellStatus 3 Public S As source 4 Public Position As Point '論理位置 5 Public Rectangle As Rectangle '物理位置 6 Public Focused As Boolean 7 8 '■コンストラクタ 9 Public Sub New(ByVal S As source, ByVal Position As Point) 10 11 Me.S = S 12 Me.Position = Position 13 14 Dim Rect As New Rectangle 15 16 '物理位置を求める。 17 Rect.X = Position.X * source.CellSize 18 Rect.Y = Position.Y * source.CellSize 19 Rect.Width = source.CellSize 20 Rect.Height = source.CellSize 21 22 Me.Rectangle = Rect 23 End Sub 24 25 '■Focus 26 Public Sub Focus() 27 28 Dim X As Integer 29 Dim Y As Integer 30 31 '同じグリッドに属する自分以外のセルを非アクティブにする。 32 For X = 0 To source.XCount - 1 33 For Y = 0 To source.YCount - 1 34 S.Cells(X, Y).Focused = False 35 Next 36 Next 37 38 '自分自身をアクティブにする。 39 Me.Focused = True 40 41 End Sub 42 43 Public Sub Draw(ByVal g As Graphics) 44 45 Dim CellRect As Rectangle 46 Dim oPen As New Pen(Color.Orange, 3) 47 48 'オレンジ枠に余裕を持たせる 49 CellRect = Me.Rectangle 50 CellRect.Inflate(-2, -2) 51 Dim fnt As New Font("MS UI Gothic", 20) 52 53 'CellStatusによって表示を変更 54 Select Case Me.Status 55 Case CellStatus._1 56 g.DrawString(1, fnt, Brushes.Orange, 0, 0) 57 Case CellStatus._2 58 g.DrawString(2, fnt, Brushes.Black, 0, 0) 59 Case CellStatus._3 60 g.DrawString(3, fnt, Brushes.Black, 0, 0) 61 Case CellStatus._4 62 g.DrawString(4, fnt, Brushes.Black, 0, 0) 63 Case CellStatus._5 64 g.DrawString(5, fnt, Brushes.Black, 0, 0) 65 Case CellStatus._6 66 g.DrawString(6, fnt, Brushes.Black, 0, 0) 67 Case CellStatus._7 68 g.DrawString(7, fnt, Brushes.Black, 0, 0) 69 Case CellStatus._8 70 g.DrawString(8, fnt, Brushes.Black, 0, 0) 71 Case CellStatus._9 72 g.DrawString(9, fnt, Brushes.Black, 0, 0) 73 Case CellStatus.Nothing 74 g.DrawString(777, fnt, Brushes.Black, 0, 0) 75 End Select 76 77 'フォーカスのある枠をオレンジで囲む 78 If Me.Focused Then 79 g.DrawRectangle(oPen, CellRect) 80 End If 81 82 End Sub 83End Class
回答2件
あなたの回答
tips
プレビュー