質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1217閲覧

Pictureboxで作成した表にキー入力した値を受け取りたい

anpan___

総合スコア28

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/11/28 05:41

編集2019/11/29 02:49

現在、VB.NETで数独を作成しております。
![イメージ説明

実際のゲーム画面はこちらです。
Formの上にPictureboxを配置し、Graphicsを用いて表を作成しています。

セルがオレンジで囲まれているのは、MauseMoveイベントにより、マウスがホバーしているセルに着色しています。

今できずに悩んでいることは、picturebox内のセルに対し、文字の入力を行う処理です。
つまり、
1、マウスで座標を指定
2、入力されたキー情報を受け取る
3、入力されたきー情報を対象の座標(オレンジ枠セル)に出力

出力に関しては、
Graphics.DrawStringメソッドorTextRenderer.DrawTextメソッドを用いることで実現できるのかな、と考えておりますが、座標の指定がうまくできていないのかなと考えております。

こちらはForm1のクラスです。

VB

1Public Class Form1 2 Dim S As New source 3 4 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint 5 6 S.Draw(e.Graphics) 7 8 End Sub 9 10 Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 11 12 Dim ThisCell As Cell 13 14 'マウスがある位置のセルを取得 15 ThisCell = S.CellFromPoint(e.X, e.Y) 16 17 If Not IsNothing(ThisCell) Then 18 19 ThisCell.Focus() 20 Console.ReadLine() 21 22 '現在の状態を描画(PictureBox1のPaintイベントを発生させる) 23 PictureBox1.Invalidate() '←実際の描画はすべてここで行う 24 25 End If 26 27 End Sub 28 29End 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 CellRect = Me.Rectangle 49 CellRect.Inflate(-2, -2) 50 Dim fnt As New Font("MS UI Gothic", 20) 51 52 If Me.Focused Then 53 g.DrawRectangle(oPen, CellRect) 54 End If 55 56 End Sub 57End 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

要はキー入力した値を受け取りたいということでしょうか?
「表中に文字列の入力」というと話がややこしくなります。
数独なので単純に1~9のキー入力ができればいいだけですよね(+Deleteキーくらい)。
KeyPressまたはKeyDownイベントを使うとキー入力1文字につき1回のイベントを受け取ることができます。
特定のコントロールにイベント設定しても良いですが、この手のアプリの場合、フォームで受け取ると利便性が良いです(どのコントロールがアクティブになっていてもイベントが発生するので)
その場合、フォームのKeyPreviewプロパティをTrueに設定するだけでよいです。
ここらここらを参考に。.

投稿2019/11/28 07:08

編集2019/11/28 07:09
ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpan___

2019/11/28 07:10

ご回答ありがとうございます! 仰る通りのキー入力操作ができれば解決となります。 今すぐ参考のリンクの方確認させていただきます。
anpan___

2019/11/28 08:53

大変申し訳ございません。 参考のリンク見させていただいたのですが、よく理解することができませんでした。 ご指摘いただきました、Keypress/Keydownを自身のコードでも利用できるように 他のサイトも調べて、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問