OSDN Git Service

Kybernetes1.1.6.8リリース
[kybernetes/Kybernetes.git] / main / view / ClockForm.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel;\r
4 using System.Data;\r
5 using System.Drawing;\r
6 using System.Linq;\r
7 using System.Text;\r
8 using System.Windows.Forms;\r
9 using System.Runtime.InteropServices;\r
10 \r
11 namespace com.andoutomo.kybernetes.view\r
12 {\r
13     public partial class ClockForm : Form\r
14     {\r
15         //member\r
16         private Pen secondLine;\r
17         private Pen minuteLine;\r
18         private Pen hourLine;\r
19         private Pen oval;\r
20         private Pen scale;\r
21         private Bitmap canvas;\r
22         private int remainSec;\r
23 \r
24         private const int CENTER = 89;\r
25 \r
26         public ClockForm()\r
27         {\r
28             InitializeComponent();\r
29             //指定されなかった時は、ポモドーロ・テクニックに基づき25分とする\r
30             this.remainSec = 25*60;\r
31         }\r
32 \r
33 \r
34         public ClockForm(int sec)\r
35             :this()\r
36         {\r
37             this.remainSec = sec;\r
38         }\r
39         public ClockForm(int sec, string title)\r
40             : this(sec)\r
41         {\r
42             this.Text = title;\r
43         }\r
44         public ClockForm(string title)\r
45             :this()\r
46         {\r
47             this.Text = title;\r
48         }\r
49 \r
50         /// <summary>\r
51         /// フォーム呼び出し時処理です。ペンを用意し、タイマーを動かします。\r
52         /// </summary>\r
53         /// <param name="sender"></param>\r
54         /// <param name="e"></param>\r
55         private void clockForm_Load(object sender, EventArgs e)\r
56         {\r
57             //位置を自力で真ん中に持ってくる。\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
60 \r
61             canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);\r
62 \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
68             \r
69             //Tickするまでタイムラグがあるので、-1しておく\r
70             remainSec--;\r
71 \r
72             kyTimer.Interval = 1000;\r
73             kyTimer.Start();\r
74         }\r
75 \r
76         private void kyTimer_Tick(object sender, EventArgs e)\r
77         {\r
78             pictureBox1.Image = drawClock(canvas, remainSec);\r
79 \r
80             label1.Text = getDigital(remainSec);\r
81 \r
82             remainSec--;\r
83 \r
84             if (remainSec == -1)\r
85             {\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
91             }\r
92 \r
93             if (remainSec < 0)\r
94             {\r
95                 if (remainSec % 60 == -1)\r
96                 {\r
97                     ((BaseForm)Owner).showAlert();\r
98                 }\r
99             }\r
100             //10分経ったら強制終了。\r
101             if (remainSec < -600)\r
102             {\r
103                 kyTimer.Stop();\r
104             }\r
105         }\r
106 \r
107         /// <summary>\r
108         /// デジタル部文言を生成します。\r
109         /// </summary>\r
110         /// <param name="remainSec"></param>\r
111         /// <returns></returns>\r
112         private string getDigital(int remainSec)\r
113         {\r
114             int sec = Math.Abs(remainSec % 60);\r
115             int min = Math.Abs((remainSec / 60) % 60);\r
116             //Hourバーは12分毎に動かす\r
117             int hour = Math.Abs((remainSec / (60 * 60)) % (60 * 60));\r
118             return (hour).ToString("00") + ":" + min.ToString("00") + ":" + sec.ToString("00");\r
119         }\r
120 \r
121         /// <summary>\r
122         /// 時計部分を生成します。\r
123         /// </summary>\r
124         /// <param name="remainSec"></param>\r
125         private Bitmap drawClock(Bitmap _canvas, int remainSec)\r
126         {\r
127             int sec = Math.Abs(remainSec % 60);\r
128             int min = Math.Abs((remainSec / 60) % 60);\r
129             //Hourバーは12分毎に動かす\r
130             int hour = (remainSec / (60 * 12)) % (60 * 12);\r
131             \r
132             Graphics g = Graphics.FromImage(_canvas);\r
133             g.Clear(Color.Transparent);\r
134 \r
135             //補助線を引く\r
136             for (int i = 0; i < 360; i += 30)\r
137             {\r
138                 g.DrawPie(scale, 0, 0, CENTER * 2, CENTER * 2, i, 30);\r
139             }\r
140 \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
144 \r
145             //ポジションを計算します。\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
150 \r
151             //線を引きます。\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
155 \r
156             g.Dispose();\r
157 \r
158             return _canvas;\r
159         }\r
160         /// <summary>\r
161         /// 角度と長さから、中心点からの相対位置を求めます。\r
162         /// </summary>\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
167         {\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
170 \r
171             return new FloatedPosition(posXInOval, posYInOval);\r
172 \r
173         }\r
174 \r
175 \r
176         private void button1_Click(object sender, EventArgs e)\r
177         {\r
178             this.Close();\r
179         }\r
180     }\r
181 \r
182     class FloatedPosition\r
183     {\r
184         public float xPosition\r
185         {\r
186             get;\r
187             set;\r
188         }\r
189         public float yPosition\r
190         {\r
191             get;\r
192             set;\r
193         }\r
194         public FloatedPosition(int x, int y)\r
195         {\r
196             xPosition = (float)x;\r
197             yPosition = (float)y;\r
198         }\r
199         public FloatedPosition(float x, float y)\r
200         {\r
201             xPosition = x;\r
202             yPosition = y;\r
203         }\r
204         public FloatedPosition(double x, double y)\r
205         {\r
206             xPosition = (float)x;\r
207             yPosition = (float)y;\r
208         }\r
209     }\r
210 }\r