C# シンプルでアナログなキッチン(ラーメン)タイマー

C#サンプル プログラムプログラミング
スポンサーリンク

C# DataGridView・サンプル プログラム一覧


起動すると3分(300秒)の目盛りと秒数が表示されます。

開始ボタンをクリックすると計測が始まり、3分たつと完成メッセージが表示されます。

はかる秒数は変更可能です、また画像読込ボタンをクリックすると、指定した画像ファイルを背景に設定できます。

サンプルの内容

3枚のPictureBox(背景用、目盛りと秒数用、秒針用)を重ねて表示しています。計測はTimerイベントで1秒ごとに秒針の位置を求め表示しています。はかる秒数に達すると完了メッセージを表示しています。

・はかる秒数が30秒、60秒、120秒、180秒、300秒から選べます。

・はかる秒数に合わせて、目盛りと秒数が表示されます。

・1秒毎に秒針が動き、はかる秒数になると完成メッセージが表示されます。

・背景画像を読み込めます。画像は中心に配置されます。

スポンサーリンク

使用部品

No項目名Textname部品イベント
1背景画像の表示用pictureBox1PictureBox
2目盛りと秒数の表示用pictureBox2PictureBox
3秒針の表示用pictureBox3PictureBox
4はかる秒数ラベルはかる秒数label1Label
5はかる秒数comboBox1ComboBoxSelectedValueChanged
6開始ボタン開始button1ButtonClick
7画像読込ボタン画像読込button2ButtonClick
スポンサーリンク

プログラミング

言語:C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Windows.Forms.Timer;

namespace sample
{

    /// <summary>
    /// ラーメンタイマー
    /// </summary>
    public partial class Form1 : Form
    {
        // タイマーを作成する
        Timer timer1 = new Timer();

        private int ramenTime = 0;  // 完成までの秒数
        private int ramenStep = 0;  // 1秒に進めるステップ(360を完了として)

        const int x1 = 250;         // 中心のX座標
        const int y1 = 250;         // 中心のY座標

        const int distance1 = 200;  // 中心から目盛りまでの距離
        const int distance2 = 230;  // 中心から数字までの距離
        const int distance3 = 190;  // 秒針の長さ

        private int timerCount;     // タイマーのカウント変数

        /// <summary>
        /// 画面起動時処理
        /// </summary>
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 起動時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            // タイマーの間隔を1秒にする
            timer1.Interval = 1000;

            // Tickイベントを追加する
            timer1.Tick += new EventHandler(timer1_Tick);

            // 親要素を設定する
            pictureBox2.Parent = pictureBox1;
            pictureBox3.Parent = pictureBox2;

            // クライアント領域のサイズを設定する
            pictureBox1.ClientSize = new Size(500, 500);
            pictureBox2.ClientSize = new Size(500, 500);
            pictureBox3.ClientSize = new Size(500, 500);

            // pictureBox位置を設定する
            pictureBox1.Location = new Point(10, 10);
            pictureBox2.Location = new Point(0, 0);
            pictureBox3.Location = new Point(0, 0);

            // pictureBoxの背景色を設定する
            pictureBox1.BackColor = Color.Black;

            // 目盛りと数字、秒針のpictureBoxを透過にする
            pictureBox2.BackColor = Color.Transparent;
            pictureBox3.BackColor = Color.Transparent;

            // はかる秒数の選択値を設定する
            String[] Items = { "30", "60", "120", "180", "300" };
            comboBox1.Items.AddRange(Items);

            // はかる秒数の初期値を設定する
            // 設定時に、はかる秒数の選択時処理が実行され表示される
            comboBox1.Text = "180";
        }

        /// <summary>
        /// はかる秒数の選択時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            // タイマーを停止する
            timer1.Stop();

            // タイマーのカウントを初期化する
            timerCount = 0;

            // 完成までの秒数をセットする
            ramenTime = Int32.Parse((comboBox1.SelectedItem.ToString()));

            // 1秒に進めるステップ(360を完了として)をセットする
            ramenStep = 360 / ramenTime;

            // 目盛りと秒数を表示する
            haikeiDisplay();

            // 秒針を表示する
            byōshinDisplay();
        }

        /// <summary>
        /// 目盛りと秒数の表示処理
        /// </summary>
        private void haikeiDisplay()
        {
            // 白で幅1のペンを作成する
            Pen p = new Pen(Brushes.White, 1);

            // pictureBox2にビットマップをセットする
            pictureBox2.Image = new Bitmap(pictureBox2.Width, pictureBox2.Height);

            // pictureBox2のImageに描画するGraphicsを作成する
            Graphics g = Graphics.FromImage(pictureBox2.Image);

            // 中心の円を描画する
            g.DrawEllipse(p, x1 - 20, y1 - 20, 40, 40);

            // 目盛りと秒数を表示する
            for (int r = 0; r < 360; r += ramenStep)
            {
                // 目盛り格納変数
                int x2 = 0;
                int y2 = 0;

                // 目盛りの表示位置を求める
                clalcXY(r, distance1, ref x2, ref y2);

                //目盛りの描画
                g.DrawEllipse(p, x2, y2, 3, 3);

                // 20度毎に秒数を表示する
                if (r % 20 == 0)
                {
                    // 移動後の秒数の格納変数
                    int x3 = 0;
                    int y3 = 0;

                    // 秒数の表示位置を求める
                    clalcXY(r, distance2, ref x3, ref y3);

                    // フォントを設定する
                    Font fnt = new Font("Impact", 14);

                    // 秒数を白で表示する(xに対して-10、yに対して-8は目視で調整した適当な値)
                    g.DrawString((r / ramenStep).ToString(), fnt, Brushes.White, x3 - 10, y3 - 8);
                }
            }

            //graphicsを開放する
            g.Dispose();
        }

        /// <summary>
        /// 秒針の表示処理
        /// </summary>
        private void byōshinDisplay()
        {
            // 赤で幅5のペンを作成する
            Pen p = new Pen(Brushes.Red, 5);

            // pictureBox3にビットマップをセットする
            pictureBox3.Image = new Bitmap(pictureBox3.Width, pictureBox3.Height);

            // pictureBox3のImageに描画するGraphicsを作成する
            Graphics g = Graphics.FromImage(pictureBox3.Image);

            // 秒針の格納変数
            int x2 = 0;
            int y2 = 0;

            // 移動後の秒針の位置を求める
            clalcXY(timerCount * ramenStep, distance3, ref x2, ref y2);

            // 秒針を描画する
            g.DrawLine(p, new Point(x1, y1), new Point(x2, y2));

            //graphicsを開放する
            g.Dispose();
        }

        /// <summary>
        /// 角度と長さから移動後の位置を求める
        /// </summary>
        /// <param name="r"></param>
        /// <param name="distance"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        private void clalcXY(int r, int distance, ref int x, ref int y)
        {
            x = (int)(x1 + distance * Math.Cos((r - 90) * (Math.PI / 180)));
            y = (int)(y1 + distance * Math.Sin((r - 90) * (Math.PI / 180)));
        }

        /// <summary>
        /// 開始ボタンクリック処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // タイマーカウントを初期化する
            timerCount = 0;

            // タイマーを開始する
            timer1.Start();
        }

        /// <summary>
        /// タイマーイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            // タイマーカウントを加算する
            timerCount += 1;

            // 秒針を表示する
            byōshinDisplay();

            // ラーメンが完成したか判定する
            if (timerCount >= ramenTime)
            {
                // 完成したのでタイマーを停止する
                timer1.Stop();

                // 完成のメッセージを表示する
                MessageBox.Show("カップラーメン完成しました!", "情報", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// <summary>
        /// 画像読込ボタンクリック時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            // OpenFileDialogを宣言する
            OpenFileDialog dialog = new OpenFileDialog();

            // 初期フォルダを設定する
            dialog.InitialDirectory = @"C:\";

            // ファイルの種類を設定する
            dialog.Filter = "画像ファイル(*.png,*.jpg,*.bmp,*.gif)|*.png;*.jpg;*.bmp;*.gif|すべてのファイル(*.*)|*.*";

            // 画像ファイルを選択にする
            dialog.FilterIndex = 1;

            // タイトルを設定する
            dialog.Title = "画像ファイルを選択してください";

            //ダイアログを表示する
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                // 画像を読み込む
                pictureBox1.Image = System.Drawing.Image.FromFile(dialog.FileName);

                // 画像を中央に配置する
                pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
            }
        }
    }
}

実行結果

起動すると3分(300秒)の目盛りと秒数が表示されます。

開始ボタンをクリックすると計測が始まります。

3分たつと完成メッセージが表示されます。

画像読込ボタンをクリックすると、画像ファイルの選択が行えます。

画像ファイルを選択すると背景に設定されます。

はかる秒数で30秒を選択すると、30秒の目盛りと秒数が表示されます。

以上です。

スポンサーリンク
タイトルとURLをコピーしました