【C#】【Windowsフォームアプリケーション】タイピングの練習をするためのアプリを作る

はじめに

「REALFORCE」という有名な高級キーボードを使っています。

良いキーボードを使うとタイピングが速くなるかというとそういうものでもありません。

相変わらず打ち間違いも多いです。

自身のタイピング力のなさはキーボードでは補えないようです。

ということでタイピングの練習をすることにしました。

そのためにC#で簡易アプリを作成しました。

完成品


説明

テキストファイルを選択するとその内容が上部に表示されます。

それと同じ文字を入力するだけです。

入力が終わると時間が表示されます。

C#コード

GUI構築を含めてすべて一つのファイルにまとめて書きました。

using System;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string question_txt;

        SplitContainer sp = new SplitContainer();
        FlowLayoutPanel flp = new FlowLayoutPanel();
        TableLayoutPanel tlp = new TableLayoutPanel();

        Button dummy = new Button();
        Button selectFile = new Button();
        Button start = new Button();

        TextBox question = new TextBox();
        TextBox answer = new TextBox();

        Stopwatch sw = new Stopwatch();
        public Form1()
        {
            Load += Form1_Load;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Size = new Size(800, 600);
            Text = "Typing";

            sp.Orientation = Orientation.Horizontal;
            sp.Dock = DockStyle.Fill;
            sp.FixedPanel = FixedPanel.Panel1;
            sp.IsSplitterFixed = true;

            flp.FlowDirection = FlowDirection.LeftToRight;
            flp.Dock = DockStyle.Fill;

            Controls.Add(sp);

            sp.Panel1.Controls.Add(flp);

            selectFile.Text = "Select File";
            selectFile.Font = new Font("Lucida Console", 12);
            selectFile.Anchor = AnchorStyles.None;
            selectFile.Click += selectFile_Click;
            selectFile.ForeColor = Color.White;
            selectFile.TabStop = false;
            selectFile.Width = 200;

            start.Text = "Start";
            start.Font = new Font("Lucida Console", 12);
            start.Anchor = AnchorStyles.None;
            start.Click += Start_Click;
            start.ForeColor = Color.White;
            start.Enabled = false;
            sp.Panel1.BackColor = Color.Blue;
            
            sp.SplitterDistance = start.Height + 10;

            dummy.Size = new Size(0, sp.Panel1.Height);
            dummy.Margin = new Padding(0, 0, 0, 0);

            flp.Controls.Add(dummy);
            flp.Controls.Add(selectFile);
            flp.Controls.Add(start);

            for (int i = 0; i < 2; i++)
            {
                tlp.RowStyles.Add(new RowStyle(SizeType.Percent, 50f));
            }

            tlp.Dock = DockStyle.Fill;
            sp.Panel2.Controls.Add(tlp);

            question.Multiline = true;
            question.Enabled = false;
            question.Font = new Font("游ゴシック", 16);
            question.Dock = DockStyle.Fill;

            answer.Multiline = true;
            answer.ImeMode = ImeMode.On;
            answer.Font = new Font("游ゴシック", 16);
            answer.Dock = DockStyle.Fill;
            answer.ForeColor = Color.White;
            answer.BackColor = Color.FromArgb(30, 30, 30);
            answer.TextChanged += Answer_TextChanged;

            tlp.Controls.Add(question, 0, 0);
            tlp.Controls.Add(answer, 0, 1);
        }
        private void Answer_TextChanged(object sender, EventArgs e)
        {
            if (((TextBox)sender).Text == question_txt)
            {
                sw.Stop();
                TimeSpan ts = sw.Elapsed;
                MessageBox.Show($"{ts.Minutes}分 {ts.Seconds}秒");
            }
        }
        private void Start_Click(object sender, EventArgs e)
        {
            answer.Text = "";
            answer.Focus();

            sw.Restart();
        }
        private void selectFile_Click(object sender, EventArgs e)
        {
            using (var dialog = new OpenFileDialog()
            {
                Filter = "Textファイル|*.txt",
                InitialDirectory = Directory.GetCurrentDirectory()
            })
            {
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    start.Enabled = true;
                    using (var reader = new StreamReader(dialog.FileName))
                    {
                        question_txt = reader.ReadToEnd().TrimEnd();
                    }
                    question.Text = question_txt;
                }
            }
        }
    }
}