Search Forum
(57259 Postings)
Search Site/Articles

Archived Articles
712 Articles

C# Books
C# Consultants
What Is C#?
Download Compiler
Code Archive
Archived Articles
Advertise
Contribute
C# Jobs
Beginners Tutorial
C# Contractors
C# Consulting
Links
C# Manual
Contact Us
Legal

GoDiagram for .NET from Northwoods Software www.nwoods.com


              
Printable Version

Graphics in C# - Irregular Forms
By Sameet Singh Khajuria

Quite frankly, I think this topic is a lot of fun...the thought of making an app look completely different from the usual rectangular-formed layout really appeals to me.

Drawing an irregular form, like drawing anything, requires four things : a surface, a stylus, a color and something to draw.

Surface

The surface upon which you draw is equivivalent to two different objects within the Framework: the Graphics object and the Region Object. The Graphics object provides the methods for drawing to the device context. A device context is analogous to a co-ordinate system laid on top of the form. Useful items such as Position can be extrapolated from this object.
The Graphics object uses, what is known as Vector Graphics, which are drawings that exist on a co-ordinate system and are ideal for 2-D creations. The bounds of the Graphics object are always defined by a rectangle. The available drawing surface though, may not be a rectangle.
The Region object describes the interior of a Graphics object. This region is the actual available drawing surface. It can be a rectangle or any polygonal area. This object is typically used to limit the drawing capabilities on a form.

Stylus

This is the tool with which you draw. The .NET Framework gives you two such tools : the pen and the brush.
The purpose of the pen is to draw lines and curves. Thus, the pen can be used to draw borders, graphs and outlines of regions or shapes.
The other stylus in the toolkit is the brush. There are five types of brushes : HatchBrush, LinearGradientBrush, PathGradientBrush, SolidBrush and TextureBrush.

Color

Colors available in the Framework are categorized under two headings : KnownColor and SystemColors.
A KnownColor is essentially a color with a warm and fuzzy name : for eg. , in this enumeration you can find colors named Bisque, AliceBlue, PapayaWhip, PeachPuff etc.
Under the SystemColors class, you find the system-level settings for items in the operating system such as WindowFrame, ActiveBorder, Desktop etc.
You can also specify new colors not already defined. This is commonly done using the FromARGB method. This method requires the Alpha component; and the Red, Green and Blue components.

Object to Draw

After everything is said and done, nothing in the previous section does you any good if you don't have something to draw. So, experiment and play around. If you find something that you are interested in depicting programmatically, take a cubist approach and see what happens. That's what I did.

Here's a Sample Code (the FormBorderStyle property of the Form is set to None)

 
using System.Drawing.Drawing2D;
 
using System.Drawing.Drawing2D;
 
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)        
 {            
 GraphicsPath gp = new GraphicsPath();            
 Graphics gr = this.CreateGraphics();            
 Region r;            
 RectangleF rf;
        PointF[] p = new PointF[9];            
	Font f;            
	p[0] = new PointF(70, 0);            
	p[1] = new PointF(170, 0);            
	p[2] = new PointF(240, 70);            
	p[3] = new PointF(240, 170);
	p[4] = new PointF(170, 240);            
	p[5] = new PointF(70, 240);            
	p[6] = new PointF(0, 170);            
	p[7] = new PointF(0, 70);            
	p[8] = new PointF(70, 0);   
	gp.AddPolygon(p);            
	PathGradientBrush pgb = new PathGradientBrush(p);
	Color[] c = new Color[2];            
	c[0] = Color.Honeydew ;           
	c[1] = Color.SeaShell;            
	pgb.CenterColor = Color.Chocolate;
	pgb.SurroundColors = c;            
	gr.FillPolygon(pgb, p);            
	r = new Region(gp);            
	this.Region = r;            
	gr = this.CreateGraphics(); 
	gr.DrawPolygon(new Pen(Color.White, 5), p); 
	gr.DrawPolygon(new Pen(Color.Black, 3), p); 
	rf = new RectangleF(15, 105, 240, 115);
	f = new Font(FontFamily.GenericMonospace, 13, FontStyle.Bold);
	gr.DrawString("Irregular Form Demo", f, new LinearGradientBrush(gr.VisibleClipBounds, 
        Color.Blue, Color.Black, LinearGradientMode.BackwardDiagonal), rf);
	f.Dispose();
	gr.Dispose();
	gp.Dispose();
	r.Dispose();                    
 }