1. メニュー→ファイル→新規作成→プロジェクト
で新しいプロジェクトのダイアログで、プロジェクト名を AnalogClock とする。名前は任意。
2.
PictureBoxはダブルバッファリングにより高速な描画機能を持っています。直接 Form1 へ描画することも可能ですが、PictureBox
を使用するほうが、より柔軟に画像を扱うことができ、高速に処理ができます。そこで、今回は PictureBox
に画像を描画し、その上にアナログ時計を描画するように作ります。そのために、まずツールボックスから PictureBox を Form1
へドラッグアンドドロップします。PictureBox の右上に小さなアイコンがあるので、それをクリックすると、PictureBox
タスクが表示されます。ここで、「親コンテナにドッキングする」を選択し、PictureBox がForm1を覆うようにします。
3. 次に、1秒ごとに時計を動かす必要があります。このために、ツールボックスから
Timer をForm1 へドラッグアンドドロップします。
4. Timer のプロパティ で Interval を 1000
(1秒)、Enabled を True とし、1秒ごとにタイマーによりキックがかかるようにします。
5. タイマーをダブルクリックすると、次のように timer1_Tick
イベントが自動的に追加される。この timer1_Tick
は1秒に1回呼び出されることになります。そこで、pictureBox1.Invalidate() を呼び出すことにより、1秒ごとに
pictureBox1 を無効化します。すると、自動的に pictureBox1 の OnPaint が呼ばれるようになります。そこで、pictureBox1
のプロパティを表示し、稲妻ボタンをクリックします。この中で、Paint イベントをダブルクリックすると、picture1_Paint
イベントが追加されます。
そこで、時計を書くためのメソッド DrawClock( e.Graphics ) を呼び出します。
using
System; using
System.Collections.Generic; using
System.ComponentModel; using
System.Data; using
System.Drawing; using
System.Text; using
System.Windows.Forms;
namespace AnalogClock { public
partial
class
Form1
: Form {
public
Form1() {
InitializeComponent(); }
private
void pictureBox1_Paint(object
sender, PaintEventArgs e) {
DrawClock(e.Graphics); } } } |
6. それでは、実際に時計を描画するための DrawClock を実装しましょう。
処理を簡単にするために、Graphicsの原点を pictureBox1 の中心に移動(Translate)
して描画しています。そのことだけ注意すれば、DrawClock
自体は難しくないので、コードを読めば理解できると思います。
7. あとは適当な画像を pictureBox1 の image
プロパティにセットします。
VS 2005 では、ローカルとプロジェクトの2つのリソーススコープをサポートしています。
ローカルリソース・・・フォームまたはローカルリソースファイルで指定します。
プロジェクトリソース・・・プロジェクトのリソースファイルで指定します。
今回は、特にリソースファイルを後から操作することはしないので、どちらでもOKです。
ローカルリソースのインポートボタンより適当な画像をインポートします。ここでは、NASAからファイルをダウンロードしたものを使用します。
8. ここまでで実行すると、次のようなアプリケーションが起動できるはずです。
9. このままでは、画像のサイズとアプリケーションのサイズが一致しません。そこで、画像のサイズにアプリケーションのサイズを合わせます。Form1
の Load イベントをダブルクリックして、イベントハンドラを追加します。
ここで、pictureBox1 の Image の Width, Height で、Form1 の ClientSizeCore
を合わせます。
private
void
Form1_Load(object
sender, EventArgs
e) { SetClientSizeCore(pictureBox1.Image.Width,
pictureBox1.Image.Height); } |
あとは、フォームをリサイズできないように、フォームの FormBorderStyle をFixed3Dにします。