Karishma Karishma - 7 days ago 6
C# Question

Using analog clock in C# Windows Forms

I need to make a analog clock in my windows form menu page in C#.

I have created a user control named "AnalogControl". It uses a timer and here is the code for it:-

public partial class AnalogClock : UserControl
{
const float PI = 3.141592654F;

DateTime dateTime;

float fRadius, fCenterX, fCenterY, fCenterCircleRadius, fHourLength;
float fMinLength, fSecLength, fHourThickness, fMinThickness, fSecThickness;
bool bDraw5MinuteTicks = true;
bool bDraw1MinuteTicks = true;
float fTicksThickness = 2;

Color hrColor = Color.Black;
Color minColor = Color.Black;
Color secColor = Color.Black;
Color circleColor = Color.Black;
Color ticksColor = Color.Black;


public AnalogClock()
{
InitializeComponent();
}

private void AnalogClock_Load(object sender, EventArgs e)
{
dateTime = DateTime.Now;
this.AnalogClock_Resize(sender, e);
}




private void DrawLine(float fThickness, float fLength, Color color, float fRadians,

System.Windows.Forms.PaintEventArgs e)
{
e.Graphics.DrawLine(new Pen(color, fThickness),
fCenterX - (float)(fLength / 9 * System.Math.Sin(fRadians)),
fCenterY + (float)(fLength / 9 * System.Math.Cos(fRadians)),
fCenterX + (float)(fLength * System.Math.Sin(fRadians)),
fCenterY - (float)(fLength * System.Math.Cos(fRadians)));
}

private void DrawPolygon(float fThickness, float fLength, Color color, float fRadians,

System.Windows.Forms.PaintEventArgs e)
{

PointF A = new PointF((float)(fCenterX + fThickness * 2 * System.Math.Sin(fRadians + PI / 2)),
(float)(fCenterY - fThickness * 2 * System.Math.Cos(fRadians + PI / 2)));
PointF B = new PointF((float)(fCenterX + fThickness * 2 * System.Math.Sin(fRadians - PI / 2)),
(float)(fCenterY - fThickness * 2 * System.Math.Cos(fRadians - PI / 2)));
PointF C = new PointF((float)(fCenterX + fLength * System.Math.Sin(fRadians)),
(float)(fCenterY - fLength * System.Math.Cos(fRadians)));
PointF D = new PointF((float)(fCenterX - fThickness * 4 * System.Math.Sin(fRadians)),
(float)(fCenterY + fThickness * 4 * System.Math.Cos(fRadians)));
PointF[] points = { A, D, B, C };
e.Graphics.FillPolygon(new SolidBrush(color), points);
}

private void AnalogClock_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
float fRadHr = (dateTime.Hour % 12 + dateTime.Minute / 60F) * 30 * PI / 180;
float fRadMin = (dateTime.Minute) * 6 * PI / 180;
float fRadSec = (dateTime.Second) * 6 * PI / 180;

DrawPolygon(this.fHourThickness,
this.fHourLength, hrColor, fRadHr, e);
DrawPolygon(this.fMinThickness,
this.fMinLength, minColor, fRadMin, e);
DrawLine(this.fSecThickness,
this.fSecLength, secColor, fRadSec, e);


for (int i = 0; i < 60; i++)
{
if (this.bDraw5MinuteTicks == true && i % 5 == 0)
// Draw 5 minute ticks
{
e.Graphics.DrawLine(new Pen(ticksColor, fTicksThickness),
fCenterX +
(float)(this.fRadius / 1.50F * System.Math.Sin(i * 6 * PI / 180)),
fCenterY -
(float)(this.fRadius / 1.50F * System.Math.Cos(i * 6 * PI / 180)),
fCenterX +
(float)(this.fRadius / 1.65F * System.Math.Sin(i * 6 * PI / 180)),
fCenterY -
(float)(this.fRadius / 1.65F * System.Math.Cos(i * 6 * PI / 180)));
}
else if (this.bDraw1MinuteTicks == true) // draw 1 minute ticks
{
e.Graphics.DrawLine(new Pen(ticksColor, fTicksThickness),
fCenterX +
(float)(this.fRadius / 1.50F * System.Math.Sin(i * 6 * PI / 180)),
fCenterY -
(float)(this.fRadius / 1.50F * System.Math.Cos(i * 6 * PI / 180)),
fCenterX +
(float)(this.fRadius / 1.55F * System.Math.Sin(i * 6 * PI / 180)),
fCenterY -
(float)(this.fRadius / 1.55F * System.Math.Cos(i * 6 * PI / 180)));
}
}

//draw circle at center
e.Graphics.FillEllipse(new SolidBrush(circleColor),
fCenterX - fCenterCircleRadius / 2,
fCenterY - fCenterCircleRadius / 2,
fCenterCircleRadius, fCenterCircleRadius);
}



private void AnalogClock_Resize(object sender, EventArgs e)
{
this.Width = this.Height;
this.fRadius = this.Height / 2;
this.fCenterX = this.ClientSize.Width / 2;
this.fCenterY = this.ClientSize.Height / 2;
this.fHourLength = (float)this.Height / 3 / 1.85F;
this.fMinLength = (float)this.Height / 3 / 1.20F;
this.fSecLength = (float)this.Height / 3 / 1.15F;
this.fHourThickness = (float)this.Height / 100;
this.fMinThickness = (float)this.Height / 150;
this.fSecThickness = (float)this.Height / 200;
this.fCenterCircleRadius = this.Height / 50;
timer1.Start();

}
public Color HourHandColor
{
get { return this.hrColor; }
set { this.hrColor = value; }
}

public Color MinuteHandColor
{
get { return this.minColor; }
set { this.minColor = value; }
}

public Color SecondHandColor
{
get { return this.secColor; }
set
{
this.secColor = value;
this.circleColor = value;
}
}

public Color TicksColor
{
get { return this.ticksColor; }
set { this.ticksColor = value; }
}

public bool Draw1MinuteTicks
{
get { return this.bDraw1MinuteTicks; }
set { this.bDraw1MinuteTicks = value; }
}

public bool Draw5MinuteTicks
{
get { return this.bDraw5MinuteTicks; }
set { this.bDraw5MinuteTicks = value; }
}



private void timer1_Tick(object sender, EventArgs e)
{
this.dateTime = DateTime.Now;
this.Refresh();
}

public void Start()
{
timer1.Enabled = true;
this.Refresh();
}

public void Stop()
{
timer1.Enabled = false;
}


}


I am using this control in another form on load event this way:-

this.analogClock1.Start();


But the problem is that on the page where I am using the "Analog Control",it is just showing up the box but is not showing up the clock and not even the clock is working.

Kindly help me with the code so that I can run an analog clock on my windows form.

Answer

The snippet you provided looks an awful lot like a publicely available sample by Syed Mehroz Alam. By quickly inspecting his code it looks like you're not hooking up onto the events for the timer and the form itself.

Adding the following to your InitializeComponent() will do the trick:

private void InitializeComponent()
{
    this.components = new System.ComponentModel.Container();
    this.timer1 = new System.Windows.Forms.Timer(this.components);
    this.SuspendLayout();
    // 
    // timer1
    // 
    this.timer1.Enabled = true;
    this.timer1.Interval = 1000;
    this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
    // 
    // AnalogClock
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    this.Name = "AnalogClock";
    this.Resize += new System.EventHandler(this.AnalogClock_Resize);
    this.Load += new System.EventHandler(this.AnalogClock_Load);
    this.Paint += new System.Windows.Forms.PaintEventHandler(this.AnalogClock_Paint);
    this.ResumeLayout(false);
}

Note, if the code is indeed borrowed from, or inspired by another developer, it is considered good courtesy to make a mention of it.

Comments