using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;
namespace TransparentAnalogClock
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class TransparentAnalogClock : System.Windows.Forms.Form
{
private System.ComponentModel.IContainer components;
public TransparentAnalogClock( string[] args )
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
if (args.Length == 1)
{
try
{
this.BackgroundImage = System.Drawing.Image.FromFile(args[0]);
}
catch ( Exception e )
{
DialogResult res = MessageBox.Show(e.Message, this.Text,
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// デザイナ サポートに必要です。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TransparentAnalogClock));
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
//
// timer1
//
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.OnTick);
//
// contextMenu1
//
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "Exit";
this.menuItem1.Click += new System.EventHandler(this.OnExit);
//
// TransparentAnalogClock
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
this.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("$this.BackgroundImage")));
this.ClientSize = new System.Drawing.Size(244, 422);
this.ContextMenu = this.contextMenu1;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "TransparentAnalogClock";
this.Text = "C# Analog Clock";
this.TransparencyKey = System.Drawing.Color.Black;
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnMouseDown);
this.Load += new System.EventHandler(this.TransparentAnalogClock_Load);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.OnMouseUp);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.OnFormPaint);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.OnMouseMove);
}
#endregion
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.Run(new TransparentAnalogClock( args ));
}
private System.Windows.Forms.Timer timer1;
private bool mouseIsDown = false;
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private Point mouseDownPoint;
private void OnFormPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
// Translate to the center of the client window.
g.TranslateTransform(ClientSize.Width/2, ClientSize.Height/2, MatrixOrder.Append);
// Now Draw it!
DrawClock( e.Graphics );
}
private void DrawClock(Graphics g)
{
const double pai = Math.PI;
Point center = new Point (0, 0);
DateTime time = DateTime.Now;
double secAng = 2.0*pai*time.Second/60.0;
double minAng = 2.0*pai*(time.Minute + time.Second/60.0)/60.0;
double hourAng = 2.0*pai*(time.Hour + time.Minute/60.0)/12.0;
int r = Math.Min( ClientSize.Width/2, ClientSize.Height/2 ) ;
int secHandLength = (int)(0.7*r);
int minHandLength = (int)(0.9*r);
int hourHandLength = (int)(0.5*r);
Point secHand = new Point((int)(secHandLength*Math.Sin(secAng)),
(int)(-secHandLength*Math.Cos(secAng)));
Point minHand = new Point((int)(minHandLength*Math.Sin(minAng)),
(int)(-minHandLength*Math.Cos(minAng)));
Point hourHand = new Point((int)(hourHandLength*Math.Sin(hourAng)),
(int)(-hourHandLength*Math.Cos(hourAng)));
Pen YellowPen = new Pen(Color.Yellow, 3);
g.DrawLine(YellowPen, center, secHand);
Pen GreenPen = new Pen(Color.Green, 5);
g.DrawLine(GreenPen, center, minHand);
Pen RedPen = new Pen(Color.Red, 7);
g.DrawLine(RedPen, center, hourHand);
}
private void OnMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (mouseIsDown && e.Button == System.Windows.Forms.MouseButtons.Left)
{
this.Left += e.X - mouseDownPoint.X;
this.Top += e.Y - mouseDownPoint.Y;
}
}
private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
mouseDownPoint = new Point(e.X, e.Y);
mouseIsDown = true;
}
}
private void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
mouseIsDown = false;
}
}
private void OnTick(object sender, System.EventArgs e)
{
Invalidate();
}
private void FitToBackgroundImage()
{
this.SetClientSizeCore(this.BackgroundImage.Width, this.BackgroundImage.Height);
}
private void OnExit(object sender, System.EventArgs e)
{
Application.Exit();
}
private void TransparentAnalogClock_Load(object sender, System.EventArgs e)
{
FitToBackgroundImage();
}
}
}