プログラミング言語/C Sharp/アナログ時計を作ろう
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
**アナログ時計を作る [#odffd077]
***概要 [#cb3d5551]
プログラムは次のような感じになる。頭に入れておこう
+1秒おきに鳴るタイマーをセット(イベント)
+タイマーが鳴ると時刻を取得
+針を描画
+以下繰り返し
***タイマーをセットする [#o4cdcc43]
まずは普通にwindowsアプリケーションを選んで準備しよう。今...
次はタイマーコントロールを設置します。左のツールボックス...
できたtimer1をダブルクリックすれば
private void timer1_Tick(object sender, System.EventArgs...
が勝手に作られているはずです。これが1秒ごとに呼び出されま...
ここで画面を更新してあげればいいですね。
private void timer1_Tick(object sender, System.EventArgs...
{
this.Refresh();
}
***時刻を取得 [#w608d52d]
まずはPaintイベントを受け取りましょう。
private void Form1_Paint(object sender, System.Windows....
{
}
IDEならマウスだけでいけますね。これからは{}の中に書いてい...
時刻の取得はDateTime.Nowでできます。
DateTime dt = DateTime.Now;
でdt.Hourで時刻が取り出せます。以下同様
***描画の準備 [#uc771cc9]
まずキャンパスを準備しましょう。
Graphics g = e.Graphics;
g.Clear(Color.White);
ここではgがキャンパスです。1行目でキャンパスを取得して、2...
***数学のお勉強 [#tbc6fd54]
今回は簡単のため針は線で描きます。線は始点と終点がわかれ...
さて線を書くには座標を求めなければならないわけですが,xy...
そこで[[極座標>http://vipprog.net/wiki/%E4%B8%89%E8%A7%92...
極座標は中心の角度θと長さrで表す座標系です.xとy座標は以...
#mimetex( x = r\cos\Theta )
#mimetex( y = r\sin\Theta )
詳しいことは高校の教科書とかわかりやすいと思うよ.
長さrは針の種類ごとに固定です.あとは角度θを時間から求め...
private Point calc_endPoint(int r,int t,int interval)
{
//r:半径 t:時間 interval|目盛りの間隔
double cof = 2*Math.PI/interval;
int x = (int)(r*Math.Sin(cof*t))+center.X;
int y = (int)(-r*Math.Cos(cof*t))+center.Y;
return new Point(x,y);
}
終点を求める関数はこんな感じ。rは長さですね
private readonly Point center = new Point(150,150);
は適当に用意しといてください
***針を描画 [#neea2a00]
DrawLineの使い方はMSDNでも見てもらうとしてこんな感じ
g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(100...
g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint(...
g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(1...
色は見やすいように適当に。3や1のところが太さですね。後ろ...
***ソース全景 [#nc62ca20]
//ここは自動で書かれると思います 結構省略してます
private System.Windows.Forms.Timer timer1;
private void InitializeComponent()
{
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1...
this.ClientSize = new System.Drawing.Size(292, 286);
}
//こっから書いてね
private readonly Point center = new Point(150,150);
private void Form1_Paint(object sender, System.Windows.F...
{
DateTime dt = DateTime.Now;
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(10...
g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint...
g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(...
}
private Point calc_endPoint(int r,int t,int interval)
{
//r:半径 t:時間 interval|目盛りの間隔
double cof = 2*Math.PI/interval;
int x = (int)(r*Math.Sin(cof*t))+center.X;
int y = (int)(-r*Math.Cos(cof*t))+center.Y;
return new Point(x,y);
}
private void timer1_Tick(object sender, System.EventArgs...
{
this.Refresh();
}
**最後に [#h713559a]
文字盤とかは簡単にできるはずなんで自分で用意してやってみ...
また針を画像にするなどの工夫をすると楽しいと思います。
**完成版ソース [#bdaeea2a]
#ref(プログラミング言語/C Sharp/miku.jpg)
#ref(プログラミング言語/C Sharp/AnalogClock.zip)
文字盤を初音ミクにしてみました。
終了行:
**アナログ時計を作る [#odffd077]
***概要 [#cb3d5551]
プログラムは次のような感じになる。頭に入れておこう
+1秒おきに鳴るタイマーをセット(イベント)
+タイマーが鳴ると時刻を取得
+針を描画
+以下繰り返し
***タイマーをセットする [#o4cdcc43]
まずは普通にwindowsアプリケーションを選んで準備しよう。今...
次はタイマーコントロールを設置します。左のツールボックス...
できたtimer1をダブルクリックすれば
private void timer1_Tick(object sender, System.EventArgs...
が勝手に作られているはずです。これが1秒ごとに呼び出されま...
ここで画面を更新してあげればいいですね。
private void timer1_Tick(object sender, System.EventArgs...
{
this.Refresh();
}
***時刻を取得 [#w608d52d]
まずはPaintイベントを受け取りましょう。
private void Form1_Paint(object sender, System.Windows....
{
}
IDEならマウスだけでいけますね。これからは{}の中に書いてい...
時刻の取得はDateTime.Nowでできます。
DateTime dt = DateTime.Now;
でdt.Hourで時刻が取り出せます。以下同様
***描画の準備 [#uc771cc9]
まずキャンパスを準備しましょう。
Graphics g = e.Graphics;
g.Clear(Color.White);
ここではgがキャンパスです。1行目でキャンパスを取得して、2...
***数学のお勉強 [#tbc6fd54]
今回は簡単のため針は線で描きます。線は始点と終点がわかれ...
さて線を書くには座標を求めなければならないわけですが,xy...
そこで[[極座標>http://vipprog.net/wiki/%E4%B8%89%E8%A7%92...
極座標は中心の角度θと長さrで表す座標系です.xとy座標は以...
#mimetex( x = r\cos\Theta )
#mimetex( y = r\sin\Theta )
詳しいことは高校の教科書とかわかりやすいと思うよ.
長さrは針の種類ごとに固定です.あとは角度θを時間から求め...
private Point calc_endPoint(int r,int t,int interval)
{
//r:半径 t:時間 interval|目盛りの間隔
double cof = 2*Math.PI/interval;
int x = (int)(r*Math.Sin(cof*t))+center.X;
int y = (int)(-r*Math.Cos(cof*t))+center.Y;
return new Point(x,y);
}
終点を求める関数はこんな感じ。rは長さですね
private readonly Point center = new Point(150,150);
は適当に用意しといてください
***針を描画 [#neea2a00]
DrawLineの使い方はMSDNでも見てもらうとしてこんな感じ
g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(100...
g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint(...
g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(1...
色は見やすいように適当に。3や1のところが太さですね。後ろ...
***ソース全景 [#nc62ca20]
//ここは自動で書かれると思います 結構省略してます
private System.Windows.Forms.Timer timer1;
private void InitializeComponent()
{
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1...
this.ClientSize = new System.Drawing.Size(292, 286);
}
//こっから書いてね
private readonly Point center = new Point(150,150);
private void Form1_Paint(object sender, System.Windows.F...
{
DateTime dt = DateTime.Now;
Graphics g = this.CreateGraphics();
g.Clear(Color.White);
g.DrawLine(new Pen(Color.Red,3),center,calc_endPoint(10...
g.DrawLine(new Pen(Color.Yellow,3),center,calc_endPoint...
g.DrawLine(new Pen(Color.Black,1),center,calc_endPoint(...
}
private Point calc_endPoint(int r,int t,int interval)
{
//r:半径 t:時間 interval|目盛りの間隔
double cof = 2*Math.PI/interval;
int x = (int)(r*Math.Sin(cof*t))+center.X;
int y = (int)(-r*Math.Cos(cof*t))+center.Y;
return new Point(x,y);
}
private void timer1_Tick(object sender, System.EventArgs...
{
this.Refresh();
}
**最後に [#h713559a]
文字盤とかは簡単にできるはずなんで自分で用意してやってみ...
また針を画像にするなどの工夫をすると楽しいと思います。
**完成版ソース [#bdaeea2a]
#ref(プログラミング言語/C Sharp/miku.jpg)
#ref(プログラミング言語/C Sharp/AnalogClock.zip)
文字盤を初音ミクにしてみました。
ページ名: