Click here to Skip to main content
Licence 
First Posted 2 Dec 2003
Views 129,138
Bookmarked 42 times

GraphSheet Control for Windows

By | 29 Nov 2005 | Article
A GraphSheet control in .NET, using GDI+ and the System.Drawing namespace.

Sample Image - GraphSheetControl.png

Introduction

In this article, I intend to create a GraphSheet control in .NET, using GDI+. It's a plain simple control using all available features of the Graphics object. We create the GraphSheet control as a 'Windows User Control' project. More on the control and its usage in 'Why? When? How?' below...

The code

The code is self explanatory. In this GraphSheet control, I create a bitmap of the graph sheet with gridlines. I have also created public methods to make it easier to draw points, and to add a set of points to an array which can then be used to draw a line or a curve. There are also public variables to introduce an offset in the X or Y axes or both axes, in the graph. We also create Boolean flags to enable or disable gridlines, display scale units as text, etc.

Using the Control

Add the control to any Windows project.. and then call its methods and properties like any other control.

    Private Sub Form1_Load(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles MyBase.Load
         gs.Xscale_Max = 10
         gs.Yscale_Max = 10
         gs.Xscale_units = 1
         gs.Yscale_units = 1
    
         gs.showBorder = True
    
         gs.displayUnits = True
         gs.fontSize = 6
    
         'gs.MarginX = 10
         'gs.MarginY = 40
         gs.initializeGraphSheet()
         gs.AddPoint(1, 1)
         gs.AddPoint(2, 5)
         gs.AddPoint(3, 3)
         gs.AddPoint(5, 5)
         gs.AddPoint(7, 5)
         gs.AddPoint(9, 9)
         gs.AddPoint(7, 9)
         gs.AddPoint(4, 6)
    
        gs.DrawGraph(GraphSheetControl.GraphSheet.PlotType.Curve, _
              Color.Blue, False)
        'gs.DrawPoint(2, 5, Color.SaddleBrown)
    End Sub

.NET and Graphics

.NET has definitely made things simple for producing graphics, especially for VB programmers. We had to really be good at mathematics if we had to produce an optimized yet flexible code like this in Visual basic 6.0. One good example is the DrawCurve method of the Graphics object which draws a curve through a set of points passed to it as an array. If it were Visual Basic 6.0, it wouldn't have been this simple.

    oG.DrawCurve(New Pen(color.red), PointsArray)

.NET though, hasn't made everything easy for the graphics part of things, for VB programmers at least. Creating a Windows control that would draw itself entirely is not easy, and even if done, not feasible to be used in production.

  • Every time the control's Paint event is fired, it would have to draw itself. Implementing this causes flicker, continuously firing the event, and even MSDN advises against writing code in paint events for such controls.
  • For a control that draws itself, I could not find any easy mechanism to save the drawing as a graphic object, to be restored during repaints. I could only find methods to save and restore the state of the Graphics object. It seems like drawing can be stored only as an Image, and have to be restored from an Image. I preferred using a simple mechanism of creating an Image object and displaying it in a PictureBox in this article's code.
  • Graphics objects don't redraw / repaint themselves, neither do they remember their last drawn state. You have to call an Invalidate method to make sure your object updates every time there's a change.
  • You can draw on various surfaces, a Form, a Panel, etc. But if you use anything other than the Image objects, you will have to redraw on every paint.

Why? When? and How?

Well, we have Chris Maunder commenting on this article. God, where did I get into...was my first expression on the comment. :)

The GraphSheet control was to make my code more pleasant on a small project, where I needed to plot graphs based on information, dynamically. The image added to this article has a small clipping of the output (right hand side of the image) of this project.

The control did make the final code well maintainable. I had to just modify code in the control to make offsetting, err handling, etc., possible, and the change took effect on all graphs drawn thereafter.

With the Drawing and Graphics namespace related code isolated, the project's code clearly showed a sign of big relief. I had to create as many instances of the GraphSheet control needed, add points from the data to the control (here, we could also modify the control to allow data binding), and draw the graphs. More importantly, I had created logic in the control to size the graph according to the size of the control, and to allow offsetting if necessary.

To add to all this, since it's a control, I could create an instance dynamically and position it on my project.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Harish Palaniappan


Synechron Technologies, Pune
India India

Member

Follow on Twitter Follow on Twitter
Harish loves computers for their basic quality of running tasks given and doing things clockwork without day-dreaming like him.
 
Note: My employer does not subscribe to my thoughts posted in my articles.

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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 Pinmembermanoj kumar choubey2:47 20 Feb '12  
GeneralWrong second serie graph Pinmemberedwarmartinez17:10 23 May '08  
QuestionHow to set up to compile in Visual Basic 2005 Express Pinmemberringram20777:37 21 Feb '07  
AnswerRe: How to set up to compile in Visual Basic 2005 Express Pinmemberpm823:34 10 Oct '07  
GeneralUnits dont appear Pinmembersanketkhan13:39 30 Jan '07  
GeneralSize the graph according to the size of the control Pinmemberayshegul22:50 4 Sep '06  
GeneralVery Helpful PinmemberCheebee5:48 23 May '06  
Generalmore confusing than helpful Pinmembermarkwaldin14:20 31 Mar '06  
GeneralRe: more confusing than helpful Pinmemberdesdichado181912:32 15 Apr '06  
GeneralRe: more confusing than helpful Pinmembersanketkhan15:46 30 Jan '07  
Questioni want use paint in vb.net. Please help me. Pinmemberss_136321:07 25 Mar '06  
Generalgs.clearPointsTable() Pinmember[Neno]9:25 13 Mar '06  
GeneralRe: gs.clearPointsTable() Pinmember[Neno]10:03 13 Mar '06  
Generalvb,net simple program Pinmemberkondapally5:39 9 Mar '06  
GeneralMisstakes in V1.1 PinmemberFelix Reimer20:54 21 Feb '06  
Hello
 
I found some misstakes in your Control in V1.1
 
You have insert the possibility to select a Scale_Min, but you have forgotten to take into consideration the factor in the AddPoint function.
 
I insert this

x -= Xscale_Min
Points(UBound(Points)).X = ((x / Xscale_units) * Xaxis_scale) + MarginX
Points(UBound(Points)).Y = (((Yscale_Max - y) / Yscale_units) * Yaxis_scale)

the Second misstake is in the initializeGraphSheet() Function
 
here you also forgot the Scale_Min
 
I changed this part
 
I insert this

If displayXUnits Then
oG.DrawString(CStr(iTemp * Xscale_units + Xscale_Min), New Font("Verdana", fontSize, FontStyle.Regular), New SolidBrush(Color.Black), tempX, tempY)
End If

 
Greets Felix
GeneralLabels for the grid PinmemberRowbinder1:24 9 Jan '06  
GeneralRe: Labels for the grid Pinmemberdesdichado181912:37 15 Apr '06  
GeneralRe: Labels for the grid Pinmembersanketkhan15:45 30 Jan '07  
QuestionI added some features, do you want them? PinmemberDave Sherman9:41 23 Nov '05  
AnswerRe: I added some features, do you want them? Pinmemberkdaily9914:00 13 Nov '07  
Generaltwo series PinmemberMr Fontenot15:20 17 Jul '05  
GeneralRe: two series Pinmemberkurtspokas3:39 16 May '07  
GeneralRe: two series Pinmemberedwarmartinez15:59 23 May '08  
Generalplot display with VB program PinmemberJanet Willi15:55 15 May '05  
QuestionMaximum Lenght? Pinmembermcprichy12:39 29 Jul '04  

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.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120529.1 | Last Updated 29 Nov 2005
Article Copyright 2003 by Harish Palaniappan
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid