2 using System.Collections.Generic;
\r
3 using System.ComponentModel;
\r
5 using System.Drawing;
\r
8 using System.Windows.Forms;
\r
9 using System.Runtime.InteropServices;
\r
11 namespace com.andoutomo.kybernetes.view
\r
13 public partial class ClockForm : Form
\r
16 private Pen secondLine;
\r
17 private Pen minuteLine;
\r
18 private Pen hourLine;
\r
21 private Bitmap canvas;
\r
22 private int remainSec;
\r
24 private const int CENTER = 89;
\r
28 InitializeComponent();
\r
29 //指定されなかった時は、ポモドーロ・テクニックに基づき25分とする
\r
30 this.remainSec = 25*60;
\r
34 public ClockForm(int sec)
\r
37 this.remainSec = sec;
\r
39 public ClockForm(int sec, string title)
\r
44 public ClockForm(string title)
\r
51 /// フォーム呼び出し時処理です。ペンを用意し、タイマーを動かします。
\r
53 /// <param name="sender"></param>
\r
54 /// <param name="e"></param>
\r
55 private void clockForm_Load(object sender, EventArgs e)
\r
58 this.Location = new Point(this.Owner.Location.X + (this.Owner.Width - this.Width) / 2,
\r
59 this.Owner.Location.Y + (this.Owner.Height - this.Height) / 2);
\r
61 canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
\r
63 oval = new Pen(Color.Black, 1f);
\r
64 secondLine = new Pen(Color.Gray, 2f);
\r
65 minuteLine = new Pen(Color.Black, 4f);
\r
66 hourLine = new Pen(Color.Black, 6f);
\r
67 scale = new Pen(Color.LightGray, 1f);
\r
69 //Tickするまでタイムラグがあるので、-1しておく
\r
72 kyTimer.Interval = 1000;
\r
76 private void kyTimer_Tick(object sender, EventArgs e)
\r
78 pictureBox1.Image = drawClock(canvas, remainSec);
\r
80 label1.Text = getDigital(remainSec);
\r
84 if (remainSec == -1)
\r
86 secondLine.Color = Color.Red;
\r
87 minuteLine.Color = Color.Red;
\r
88 hourLine.Color = Color.Red;
\r
89 oval.Color = Color.Red;
\r
90 label1.ForeColor = Color.Red;
\r
95 if (remainSec % 60 == -1)
\r
97 ((BaseForm)Owner).showAlert();
\r
101 if (remainSec < -600)
\r
110 /// <param name="remainSec"></param>
\r
111 /// <returns></returns>
\r
112 private string getDigital(int remainSec)
\r
114 int sec = Math.Abs(remainSec % 60);
\r
115 int min = Math.Abs((remainSec / 60) % 60);
\r
117 int hour = Math.Abs((remainSec / (60 * 60)) % (60 * 60));
\r
118 return (hour).ToString("00") + ":" + min.ToString("00") + ":" + sec.ToString("00");
\r
124 /// <param name="remainSec"></param>
\r
125 private Bitmap drawClock(Bitmap _canvas, int remainSec)
\r
127 int sec = Math.Abs(remainSec % 60);
\r
128 int min = Math.Abs((remainSec / 60) % 60);
\r
130 int hour = (remainSec / (60 * 12)) % (60 * 12);
\r
132 Graphics g = Graphics.FromImage(_canvas);
\r
133 g.Clear(Color.Transparent);
\r
136 for (int i = 0; i < 360; i += 30)
\r
138 g.DrawPie(scale, 0, 0, CENTER * 2, CENTER * 2, i, 30);
\r
141 SolidBrush bgColor = new SolidBrush(ClockForm.DefaultBackColor);
\r
142 g.DrawEllipse(oval, 0, 0, CENTER * 2, CENTER * 2);
\r
143 g.FillEllipse(bgColor, 10, 10, CENTER * 2 - 20, CENTER * 2 - 20);
\r
146 FloatedPosition center = new FloatedPosition(CENTER, CENTER);
\r
147 FloatedPosition secPosition = getPosInOval(CENTER, CENTER, 6 * sec, CENTER - 10);
\r
148 FloatedPosition minPosition = getPosInOval(CENTER, CENTER, 6 * min, CENTER - 30);
\r
149 FloatedPosition hourPosition = getPosInOval(CENTER, CENTER, 6 * hour, CENTER - 50);
\r
152 g.DrawLine(secondLine, center.xPosition, center.yPosition, secPosition.xPosition, secPosition.yPosition);
\r
153 g.DrawLine(minuteLine, center.xPosition, center.yPosition, minPosition.xPosition, minPosition.yPosition);
\r
154 g.DrawLine(hourLine, center.xPosition, center.yPosition, hourPosition.xPosition, hourPosition.yPosition);
\r
161 /// 角度と長さから、中心点からの相対位置を求めます。
\r
163 /// <param name="degree"></param>
\r
164 /// <param name="length"></param>
\r
165 /// <returns></returns>
\r
166 private FloatedPosition getPosInOval(int centerX, int centerY, int degree, int length)
\r
168 double posXInOval = (centerX + Math.Sin(degree * Math.PI / 180) * length);
\r
169 double posYInOval = (centerY + Math.Cos(degree * Math.PI / 180) * -1 * length);
\r
171 return new FloatedPosition(posXInOval, posYInOval);
\r
176 private void button1_Click(object sender, EventArgs e)
\r
182 class FloatedPosition
\r
184 public float xPosition
\r
189 public float yPosition
\r
194 public FloatedPosition(int x, int y)
\r
196 xPosition = (float)x;
\r
197 yPosition = (float)y;
\r
199 public FloatedPosition(float x, float y)
\r
204 public FloatedPosition(double x, double y)
\r
206 xPosition = (float)x;
\r
207 yPosition = (float)y;
\r