![]() |
Languages »
C# »
Windows Forms
Intermediate
A Resizable Analog Clock in C# using GDI+ & Windows FormsBy samar abbasAn analog clock using anti-aliasing & double-buffering which can be resized, even into elliptical shapes. |
C#, .NET, Win2K, WinXP, Win2003, Visual-Studio, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||

Unlike other clock programs, this program possesses the following special features:
The main part of the program is the plotting of the hands. For this, we use polar co-ordinates with the origin at the center of the window and with angle starting at the twelve-o'clock position running clockwise. The semi-width or x-radius of the clock is taken to be one-third of that of the enclosing window, ie. Width/3. Consequently, the x value is given by the sum of the x co-ordinate of the center and the radius multiplied by the sine of the angle:
int x_sec = Width/2 + (int)(Width/3 * Math.Sin(2 * Math.PI * (double)i_sec/60));
The angle is simply the fraction of a full circle, where 60 seconds correspond to 2 pi radians. In case of the y co-ordinate of the hand, we must take into account the fact that the 12 o'clock position is that of minimum y value, so that the cosine must be subtracted:
int y_sec = Height/2 - (int)(Height/3 * Math.Cos(2 * Math.PI * (double)i_sec/60));
It is often helpful to draw a diagram to elucidate the above concepts. Of course, the program uses standard coding conventions, ie. i,x,y denote integers, g denotes Graphics and f denotes Font. The minutes hand is drawn in a similar fashion. In case of hours, it must be remembered that only 12 hours make a full circle.
In order to make the numerals resizable, the following for loop is used:
for(int j=1; j <= 12; j++) // draw numerals { g.DrawString(""+j, f, Brushes.Red, Width/2 + (int)(Width/3 * Math.Sin( j * Math.PI/6)) - (int)g.MeasureString(""+j,f).Width/2, Height/2 - (int)(Height/3 * Math.Cos( j * Math.PI/6)) - (int)g.MeasureString(""+j,f).Height/2); } }
Here, the fact that each numeral represents one-sixth of one pi or semicircle is used to plot the values. Moreover, the calculated half value of the string widths and heights are subtracted in order to provide correct centering of the numerals.
To compile and run, enter
> cs time_ana.cs > time_ana.exe
Project completed on 6th Sept. 2003.
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 8 Sep 2003 Editor: Marc Clifton |
Copyright 2003 by samar abbas Everything else Copyright © CodeProject, 1999-2010 Web21 | Advertise on the Code Project |