Click here to Skip to main content
13,297,266 members (58,425 online)
Click here to Skip to main content
Add your own
alternative version


146 bookmarked
Posted 11 Jun 2007

A thermometer control

, 9 Jul 2007
Rate this:
Please Sign up or sign in to vote.
Creating an analog-style thermometer

Screenshot - Thermometer_demo.jpg


This article demonstrates a complex analog-style thermometer control in C#. The control is in pure managed code. Most visual elements can be adjusted through the control's properties.


Due to the flexibility of the control, it can be used to display all sorts of data and not just degrees as used in this example.

Screenshot - Layouts.jpg


The control consists of 2 classes: ManometerBase and Thermometer.

Screenshot - architecture.jpg

The implementation is done in the Thermometer class.


All painting is done in the OnPaint method of the Thermometer class. Every element has its own Paint method and the methods are marked protected virtual.

protected override void OnPaint(PaintEventArgs e)
    // Set smoothingmode to AntiAlias
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    // Shadow
    // Background
    // Border
    // Inner shadow
    // Bars
    // Numbers
    // Paint the text(s)
    // Paint the Arrows
    // Reflex
    // Reset smoothingmode
    e.Graphics.SmoothingMode = SmoothingMode.Default;

Painting the numbers

Most methods are straightforward, but aligning the numbers in the ellipse is somewhat tricky.

protected virtual void PaintNumbers(Graphics g)
    double tmpAngle = StartAngle;
    for (double d = Min; d<= Max; d+= Interval)
        String text = Math.Round(d, Decimals).ToString();
        PointF p = 
            tmpAngle, MeasureText(g, text, Font, (int)numberRect.Width));
        if (ClockWise)
            tmpAngle -= NumberSpacing;
            tmpAngle += NumberSpacing;
            g.DrawString(text, Font, new SolidBrush(ForeColor), p);

The solution is to find the center point of the text and then calculate the offset based on the text's position in the ellipse and its dimensions.

private PointF CalcTextPosition(double a, SizeF size)
    PointF p = PointInEllipse(numberRect, a);
    p.X -= (float)((size.Width/2)*(1 + Math.Cos(Convert.ToRadians(a))));
    p.Y -= (float)((size.Height/2)*(1 - Math.Sin(Convert.ToRadians(a))));
    return p;

The private method CalcTextPosition makes a call to PointInEllipse. This method calculates a point in an ellipse based on the angle and the size of the ellipse, which is simple math.

private static PointF PointInEllipse(RectangleF rect , double angle)
    double r1 = rect.Width/2;
    double r2 = rect.Height/2;
    double x = 
        (float)(r1 * Math.Cos(Convert.ToRadians(angle))) + r1 + rect.X;
    double y = 
        -(float)(r2 * Math.Sin(Convert.ToRadians(angle))) + r2 + rect.Y;
    return new PointF((float)x, (float)y);

Using the code

To test the control, download the demo project and then build and run it. To change the appearance of the control, use the properties:

  • Interval - The interval between each number on the control; this is a floating point number.
  • Max - The maximum on the scale.
  • Min - The minimum on the scale.
  • StartAngle - The starting point in degrees.
  • StoreMax - Show the maximum stored value (red arrow).
  • StoredMax - The stored maximum.
  • TextDescription - Set the lower text displayed on the control.
  • TextUnit - Set the text to describe the Units used.
  • Value - The value and point of the arrow.
  • ArrowColor - The color of the arrow.
  • BackColor - The inner color of the control.
  • BarsBetweenNumbers - The number of lines between two displayed numbers. Note that the alignment of the lines is dependent on the properties NumberSpacing and Interval.
  • BorderWidth - The width of the outer border.
  • ClockWise - Lay the numbers out clockwise or counter-clockwise.
  • Decimals - The number of decimals displayed; default is 0.
  • NumberSpacing - The spacing between the numbers in degrees.


  • June 09, 2007: Initial release.
  • July 08, 2007:
    • Fixed missing dispose on some objects.
    • Fixed a bug where the designer would hang if the control was added from the toolbar.
    • Changed default text on Unit and Description property.
    • Added the layout section in this document.
    • Added a demo download.
    • Removed solution from source control.


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


About the Author

Niel M.Thomas
Denmark Denmark
Name: Niel Morgan Thomas
Born: 1970 in Denmark
Dataengineer from Odense Technical University.
More than 20 years in IT-business.
Current employment:
Working with application development in a major Danish company that produce medical equipment.

You may also be interested in...


Comments and Discussions

Questionmfc version? Pin
lanmanck21-Sep-15 0:19
memberlanmanck21-Sep-15 0:19 
AnswerRe: mfc version? Pin
Niel M.Thomas21-Sep-15 1:10
professionalNiel M.Thomas21-Sep-15 1:10 
QuestionLicense Pin
Member 1031127231-Dec-13 2:51
memberMember 1031127231-Dec-13 2:51 
AnswerRe: License Pin
Niel M.Thomas31-Dec-13 3:15
memberNiel M.Thomas31-Dec-13 3:15 
Generalvery very useful Pin
batsword7-Nov-10 19:41
memberbatsword7-Nov-10 19:41 
GeneralRe: very very useful Pin
Niel M.Thomas7-Nov-10 20:17
memberNiel M.Thomas7-Nov-10 20:17 
GeneralRe: very very useful Pin
batsword11-Nov-10 16:02
memberbatsword11-Nov-10 16:02 
GeneralRe: very very useful Pin
lanmanck21-Sep-15 0:22
memberlanmanck21-Sep-15 0:22 
GeneralMy vote of 4 Pin
Member 366671421-Jul-10 2:39
memberMember 366671421-Jul-10 2:39 
GeneralKudos, and more kudos Pin
jon_sigler30-Dec-08 17:42
memberjon_sigler30-Dec-08 17:42 
GeneralVisual Studio 6 Pin
CodeHead27-Feb-08 4:13
memberCodeHead27-Feb-08 4:13 
Can this .dll be used with VC++ 6.0? If so, how?
GeneralRe: Visual Studio 6 Pin
The Dogcow Farmer14-Sep-08 3:31
memberThe Dogcow Farmer14-Sep-08 3:31 
GeneralPrograming style suggestions! Pin
Martin#17-Jul-07 0:53
memberMartin#17-Jul-07 0:53 
AnswerRe: Programing style suggestions! Pin
Niel M.Thomas18-Jul-07 2:06
memberNiel M.Thomas18-Jul-07 2:06 
GeneralRe: Programing style suggestions! Pin
Martin#18-Jul-07 2:13
memberMartin#18-Jul-07 2:13 
GeneralRe: Programing style suggestions! Pin
Michal Brylka19-Jul-07 10:31
memberMichal Brylka19-Jul-07 10:31 
GeneralMessage Closed Pin
24-Jun-08 3:32
memberJani Mukkavaara24-Jun-08 3:32 
GeneralRe: Programing style suggestions! Pin
Martin#24-Jun-08 8:04
mvpMartin#24-Jun-08 8:04 
QuestionAm I doing something wrong? Pin
rob.iles29-Jun-07 12:36
memberrob.iles29-Jun-07 12:36 
GeneralRe: Am I doing something wrong? Pin
rob.iles30-Jun-07 13:44
memberrob.iles30-Jun-07 13:44 
QuestionVery cool, but... Pin
The Marshal20-Jun-07 20:28
memberThe Marshal20-Jun-07 20:28 
AnswerRe: Very cool, fixed Pin
Niel M.Thomas20-Jun-07 21:43
memberNiel M.Thomas20-Jun-07 21:43 
AnswerRe: Very cool, but... Pin
Kevin Gallagher21-Jun-07 7:03
memberKevin Gallagher21-Jun-07 7:03 
GeneralGood control Pin
nitikin19-Jun-07 2:20
membernitikin19-Jun-07 2:20 
GeneralGreat Control Pin
merlin98112-Jun-07 4:14
membermerlin98112-Jun-07 4:14 

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

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

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.171207.1 | Last Updated 9 Jul 2007
Article Copyright 2007 by Niel M.Thomas
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid