Click here to Skip to main content
Click here to Skip to main content

How to write a loading circle animation in .NET?

, 15 Feb 2007 CPOL
Rate this:
Please Sign up or sign in to vote.
A new kind of progress bar for .NET 2.0.

Sample Image - mrg_loadingcircle.jpg


When it's time to wait, we are used to seeing the classic blue progress bar. It is everywhere in Windows and many other applications. However, animations are getting more and more popular.

For example, when Firefox loads a page, a small spinning circle appears and shows you that the page is loading. Moreover, Microsoft also uses this kind of animation in the Windows Media Center, Encarta 2006, SQL Server Management Studio Express, etc.

So, why don't we use this concept to show to our users that our application is working and/or loading? Let's begin by the presentation of the component I developed.

Points of interest

Rotation speed

The LoadingCircle uses a timer, and it has two responsibilities: to determine the color of the next spoke, and to redraw the circle at a specified number of milliseconds. When you use the property RotationSpeed, you modify the timer's property named Interval. Higher the value is, slower will be the rotation. The default rotation speed is 80, so at every 80 milliseconds, the circle will be redrawn.

How to draw a spoke?

First of all, we need coordinates for each spoke. We use the function DrawLine of GDI+, which needs two points, the beginning and the end of the line.

So, let's review some simple math notions. In order to draw a perfect circle, you have to know the following trigonometry concept: the cosines of an angle in degrees give us the X and the sine gives us the Y.

The method GetCoordinate computes, for a specified radius and angle, the coordinates of a point.

private PointF GetCoordinate(PointF _objCircleCenter, 
               int _intRadius, double _dblAngle)
      PointF objPoint = new PointF();
      double dblAngle = Math.PI * _dblAngle / NUMBER_OF_DEGREES_HALF_CIRCLE;
      objPoint.X = _objCircleCenter.X + _intRadius * (float)Math.Cos(dblAngle);
      objPoint.Y = _objCircleCenter.Y + _intRadius * (float)Math.Sin(dblAngle);
      return objPoint;

The method DrawLine uses the coordinates computed by GetCoordinate, and draws a line with the two specified points and a color. Of course, we have to pass to this method the Graphics object of GDI+. As you can see, each line is rounded with the properties StartCap and EndCap of the Pen object.

private void DrawLine(Graphics _objGraphics, PointF _objPointOne, 
                      PointF _objPointTwo, 
                      Color _objColor, int _intLineThickness)
      using(Pen objPen = new Pen(new SolidBrush(_objColor), _intLineThickness))
            objPen.StartCap = LineCap.Round;
            objPen.EndCap = LineCap.Round;
            _objGraphics.DrawLine(objPen, _objPointOne, _objPointTwo);

How to use this component?

This component is quite easy to use. Once added to your toolbox, drag it to your form, and you are in business! Now, all you have to do is to play with the properties which change the look of the circle. Those are under the category "LoadingCircle" in the Properties panel. Also, you can change the Active property to true or false to see the animation running or not.

The component has the following properties.

  • Color - The color of an inactive spoke.
  • OuterCircleRadius - This property is the radius of the outer circle. The value of this property is supposed to be higher than the InnerCircleRadius value.
  • InnerCircleRadius - This property is the radius of the inner circle.
  • NumberSpoke - This property is the number of spokes.
  • Active - Defines if the component is animated or not. So, if tour treatment is in progress, this property should be set to true, otherwise false.
  • SpokeThickness - Thickness of the line in pixel.
  • RotationSpeed - Animation speed. Lower is the value, faster is the animation.


Finally, I wish you will find this component useful. I had fun writing it, and wish you will use it. Thanks for reading this article.

Revision history

  • June 17, 2006 : Initial release.
  • February 05, 2007 : Better color management (alpha blending)
  • February 10, 2007 : Presets defined in the control (MacOS X, Internet Explorer 7 and FireFox). A new control has been added: LoadingCircleToolStripMenuItem. This control is compatible with the StatusStrip! Supports transparency. Some minors bug corrections.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Martin Gagne
Web Developer
Canada Canada
No Biography provided

Comments and Discussions

SuggestionNuGet package? PinmemberBrett Hysuik30-Jan-15 13:17 
GeneralMy vote of 5 Pinmembernitin@codeproject27-Nov-14 23:44 
QuestionChange it's Size PinmemberElaheh Ordoni9-Sep-14 4:09 
AnswerRe: Change it's Size PinmemberElaheh Ordoni9-Sep-14 19:17 
GeneralVery nice PinmemberMarcel Breu29-Sep-13 5:29 
GeneralMy vote of 4 Pinmemberravithejag8-Aug-12 21:11 
QuestionVery nice control + a question Pinmemberalex__b11-Jul-12 10:26 
QuestionWindowsFormsHost Pinmemberflobadob19754-Jul-12 5:44 
QuestionError "Cannot embed interop types from assembly" PinmemberNewOrdered130-May-12 3:04 
GeneralMy vote of 5 Pinmemberpcs041425-Apr-12 4:26 
AnswerAngles of spokes are shifted anticlockwise - any ideas? Solved! [modified] PinmemberGuyThiebaut25-Mar-12 10:17 
GeneralMy vote of 5 PinmemberGuyThiebaut25-Mar-12 7:17 
GeneralMy vote of 5 Pinmembermanoj kumar choubey18-Feb-12 4:08 
QuestionDoes not support threading Pinmemberelhenawyk20062-Feb-12 7:08 
AnswerRe: Does not support threading PinmemberMartin Gagne18-Feb-12 12:23 
Questionreally cool... PinmemberAvrajit24-Nov-11 5:08 
QuestionCompact Framework Pinmemberstijn.vandenbroucke9-Oct-11 4:36 
QuestionLike !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Pinmemberraananv31-Aug-11 13:51 
GeneralMy vote of 5 Pinmemberv# guy2-Sep-10 4:37 
GeneralVery Nice PinmemberKhaniya7-Mar-10 22:48 
Generaljust an observation Pinmemberbinarydude200131-Jan-10 16:59 
Generalwell done Pinmemberprolingua.geo9-Nov-09 0:02 
GeneralNice Work !!! PinmemberRicardoPDV13-Aug-09 13:14 
Questionmemory leak? Pinmemberval17127-Oct-08 17:30 
AnswerRe: memory leak? Pinmemberpolishz311-Feb-14 2:04 
GeneralPrinting animation PinmemberUltraWhack8-May-08 4:51 
GeneralRe: Printing animation Pinmemberjm334-Jun-08 13:47 
GeneralRe: Printing animation PinmemberUltraWhack13-Jun-08 6:06 
GeneralNot disposing all GDI+ resources: System.AccessViolationException Pinmemberbwaide22-Apr-08 20:52 
GeneralRe: Not disposing all GDI+ resources: System.AccessViolationException PinmemberMartin Gagne23-Apr-08 4:42 
GeneralRe: Not disposing all GDI+ resources: System.AccessViolationException PinmvpLuc Pattyn27-Mar-10 22:18 
QuestionHow to put a Loading Circle in a datgridviewcolmun/cell ? Pinmemberplatinum0731-Dec-07 0:08 
AnswerRe: How to put a Loading Circle in a datgridviewcolmun/cell ? PinmemberMartin Gagne31-Dec-07 4:03 
GeneralRe: How to put a Loading Circle in a datgridviewcolmun/cell ? Pinmemberplatinum071-Jan-08 9:28 
GeneralRe: How to put a Loading Circle in a datgridviewcolmun/cell ? PinmemberPatrick S30-May-08 11:47 
GeneralWindows.Forms.TImer needs to be changed to System.Timers.Timer PinmemberSuicide2023-Dec-07 18:42 
QuestionHow to add this circle control to my toolbox component? PinmemberCSharp200526-Nov-07 5:35 
QuestionBug report Pinmembercacerzard4-Sep-07 23:12 
AnswerRe: Bug report PinmemberMartin Gagne5-Sep-07 4:20 
GeneralRe: Bug report PinmvpLuc Pattyn27-Mar-10 22:21 
QuestionLoading Circle in statusStrip Pinmemberseang_sophorn19-Aug-07 18:03 
QuestionHow can use this control in Visual Basic 6 Pinmembersixtoja9-Aug-07 8:04 
AnswerRe: How can use this control in Visual Basic 6 PinmemberMartin Gagne9-Aug-07 8:46 
GeneralRe: How can use this control in Visual Basic 6 Pinmembersixtoja9-Aug-07 9:36 
Generalanother animated progress bar PinmemberOwfAdmin5-Aug-07 10:24 
GeneralThreads and loading circle PinmemberCostasAn17-Jul-07 23:17 
GeneralRe: Threads and loading circle PinmemberMartin Gagne18-Jul-07 5:06 
GeneralRe: Threads and loading circle PinmemberCostasAn18-Jul-07 21:34 
GeneralRe: Threads and loading circle PinmemberMartin Gagne19-Jul-07 6:45 
GeneralRe: Threads and loading circle PinmemberAdlibrium23-Jul-07 8:39 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.150129.1 | Last Updated 15 Feb 2007
Article Copyright 2006 by Martin Gagne
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid