起動すると3分(300秒)の目盛りと秒数が表示されます。
開始ボタンをクリックすると計測が始まり、3分たつと完成メッセージが表示されます。
はかる秒数は変更可能です、また画像読込ボタンをクリックすると、指定した画像ファイルを背景に設定できます。
サンプルの内容
3枚のPictureBox(背景用、目盛りと秒数用、秒針用)を重ねて表示しています。計測はTimerイベントで1秒ごとに秒針の位置を求め表示しています。はかる秒数に達すると完了メッセージを表示しています。
・はかる秒数が30秒、60秒、120秒、180秒、300秒から選べます。
・はかる秒数に合わせて、目盛りと秒数が表示されます。
・1秒毎に秒針が動き、はかる秒数になると完成メッセージが表示されます。
・背景画像を読み込めます。画像は中心に配置されます。
リンク
使用部品
No | 項目名 | Text | name | 部品 | イベント |
1 | 背景画像の表示用 | - | pictureBox1 | PictureBox | |
2 | 目盛りと秒数の表示用 | - | pictureBox2 | PictureBox | |
3 | 秒針の表示用 | - | pictureBox3 | PictureBox | |
4 | はかる秒数ラベル | はかる秒数 | label1 | Label | |
5 | はかる秒数 | - | comboBox1 | ComboBox | SelectedValueChanged |
6 | 開始ボタン | 開始 | button1 | Button | Click |
7 | 画像読込ボタン | 画像読込 | button2 | Button | Click |
プログラミング
言語: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秒の目盛りと秒数が表示されます。
以上です。