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

CircleControl - A Circular Motion Control

By , 8 Sep 2012
 

Introduction

This is release 1.2 of the library. It adds the SnapMode and SnapAngles properties to the CircleControl.MarkerSet class.

The CircleControl class is a .NET 2.0 control which allows circular motion, for example, rotating a dial, or setting the hands on an analog clock.

The control supports markers - graphical objects which can be positioned programmatically and/or dragged with the mouse, and marker sets, which are groups of markers which move in unison. The background may be populated with colored rings, tick marks, and text strings.

All public and protected classes, methods and properties are fully documented using standard C# XML documentation comments. The project includes an HTML help file. Refer to the 'Overview' section in the help file for more details on using the class, and refer to the 'Sample Program' section for a complete source listing of a working application.

The CircleControl_12_Library download includes:

CircleControl.dll Class library
CircleControl.chm Help file.

The CircleControl_12_Demo download includes the above files, as well as:

AnalogClock.exe Sample program showing an analog clock; the time may be changed by dragging the hour and minute hands.
ColorDialer.exe Sample program for picking a color; rotate the red, blue, and green dials to select the RGB values. The program is visually gratuitous demonstration of the control, and is not meant to be a serious color picker.
EditDefaults.exe Sample program demonstrating the effect of changing various CircleControl properties.
GantryControl.exe Sample program as detailed in the Sample Program section of the help file.
ManyRings.exe Sample program showing excessive use of rings. Includes capability to compare paint times with FixedBackground set to true or false.

The CircleControl_12_Source download includes the source for all of the above programs, as well as the necessary files for building the help file.

Using the Code

To use the CircleControl class, simply add it on an existing form:

CircleControl cc = new CircleControl();
cc.Location = new System.Drawing.Point(0, 0);
cc.Size = new System.Drawing.Size(200, 200);
form.Controls.Add(cc);

By default, a new instance of CircleControl comes ready to use with a single triangular marker and ten tick marks.

To add a new marker, create a new MarkerSet, and add one or more Marker objects:

CircleControl.MarkerSet ms = new CircleControl.MarkerSet();
cc.MarkerSets.Add(ms);

// Polygon which defines shape of marker
PointF[] poly = new PointF[4];
poly[0] = new PointF(0.25F,  0.00F);
poly[1] = new PointF(0.70F,  0.18F);
poly[2] = new PointF(0.64F,  0.00F);
poly[3] = new PointF(0.70F, -0.18F);

CircleControl.Marker m = new CircleControl.Marker(
                      Color.Brown,       // inside color
                      Color.DarkGreen,   // border color
                      1.0f,              // border thickness
                      poly,              // polygon defining marker shape
                      130.0f,            // angle offset of marker
                      MouseButtons.Left, // which button(s) can drag the marker
                      true);             // is marker visible?

// Add new marker to MarkerSet, at which point
// it becomes visible on the control
ms.Add(m);

The polygon defines the appearance of the marker at angle zero. It uses a cartesian coordinate system, where (0,0) is the center of the control, and 1.0 is the distance to the nearest edge. The internal area of a marker can be a solid color, a hatch pattern, or a variety of color gradients. Borders can be of any color and thickness.

An AngleChanged event is raised whenever the angle of a marker changes, or the mouse state of a dragged marker changes. To receive events, install a handler:

cc.AngleChanged += new CircleControl.AngleChangedHandler(OnAngleChange);

The background may be populated with colored rings, tick marks, and text strings. The following code snippet adds a beige-colored ring, and four text items, as they would be placed on a compass:

cc.Rings.Add(new CircleControl.Ring(0.6f,        // size as radius
                                    Color.Beige, // internal color
                                    Color.Black, // border color
                                    2.0f);       // border thickness

Font f = new Font("Arial", 8.0f);
cc.TextItems.Add(new CircleControl.TextItem(f,         // font
                                            Color.Red, // color
                                            "N",       // text
                                            0.8f,      // distance from origin
                                            90.0f);    // angle
cc.TextItems.Add(new CircleControl.TextItem(f, Color.Red, "S", 0.8f, 270.0f);
cc.TextItems.Add(new CircleControl.TextItem(f, Color.Red, "E", 0.8f,   0.0f);
cc.TextItems.Add(new CircleControl.TextItem(f, Color.Red, "W", 0.8f, 180.0f);

The internal area of a ring can be a solid color, a hatch pattern, or a variety of color gradients. Borders can be of any color and thickness. Text items can be of any font, color, or rotation. They can be a fixed size, or made to be relative to the size of the control.

The above code snippets only provide a brief overview. Refer to the project help file for complete class documentation.

Points of Interest

Writing, refining, and debugging the code was, as always, a joyful experience. But documenting every public and protected class, method and property was not. It was drudgery. The pain of writing full and proper documentation was offset in part by Sandcastle Help File Builder, a freely available tool used to generate the help file. But documenting everything was a learning experience, and I've developed immense respect for programmers who write complete and useful documentation, especially for those at Microsoft who are responsible for the creation of the extensive .NET documentation.

History

  • September 8, 2012 - Release 1.2
    • Added SnapMode and SnapAngles properties CircleControl.MarkerSet.
  • July 21, 2011 - Release 1.1.2
    • Fixed bug in CircleControl.Collections.Insert() method where the Cc parameter was improperly being set to null
  • November 1, 2010 - Release 1.1.1
    • Fixed bug in CircleControl.SetAngleMinMax() method where the call was ignored unless both min and max parameters were different from the current values
    • Fixed bug where marker angles were not always calculated properly if AngleWraps was false
  • October 12, 2010 - Release 1.1
    • Added FixedBackground property to CircleControl.
  • September 12, 2010 - First release

License

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

About the Author

Graham Wilson
Software Developer (Senior)
Canada Canada
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberKD0YU30 Nov '12 - 3:13 
QuestionCoolmembersam.hill8 Sep '12 - 16:27 
QuestionInvert Primary MarkermemberTodd Denlinger8 Aug '12 - 12:07 
AnswerRe: Invert Primary MarkermemberGraham Wilson8 Aug '12 - 15:58 
GeneralRe: Invert Primary MarkermemberTodd Denlinger9 Aug '12 - 4:27 
GeneralMy vote of 5memberProEnggSoft13 Mar '12 - 1:06 
GeneralMy vote of 4membermariazingzing15 Feb '12 - 12:56 
GeneralMy vote of 5memberpeteSJ22 Jul '11 - 6:57 
Questionexcellent, and fully documented codememberBillWoodruff21 Jul '11 - 12:06 
QuestionCoolmemberCIDev21 Jul '11 - 5:22 
QuestionGood workmemberShahriar Iqbal Chowdhury21 Jul '11 - 4:58 
GeneralMy vote of 5memberashishkumar00831 May '11 - 12:19 
GeneralMarkers and ringsmemberjrwakeen6 Feb '11 - 17:19 
GeneralRe: Markers and ringsmemberGraham Wilson8 Feb '11 - 16:29 
GeneralRe: Markers and ringsmemberGraham Wilson8 Feb '11 - 17:20 
GeneralMy vote of 5memberVistaHacker2 Nov '10 - 4:07 
GeneralMy vote of 5memberRoger Wright1 Nov '10 - 19:59 
GeneralMy vote of 5memberMember 154261529 Oct '10 - 7:17 
GeneralMy vote of 5memberYogi Yang19 Oct '10 - 1:09 
GeneralRe: My vote of 5memberGraham Wilson19 Oct '10 - 16:31 
GeneralMy vote of 5memberR&D_Man17 Oct '10 - 22:16 
GeneralRe: My vote of 5memberGraham Wilson19 Oct '10 - 16:30 
GeneralMy vote of 5memberWilliamCruisoring8 Oct '10 - 16:48 
GeneralRe: My vote of 5memberGraham Wilson19 Oct '10 - 16:29 
GeneralSandcastle is useful, but ironically poorly documentedmembermsorens21 Sep '10 - 12:59 

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 8 Sep 2012
Article Copyright 2010 by Graham Wilson
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid