Using Pens in GDI+


This article has been excerpted from book "Graphics Programming with GDI+".

Pens are another key object in GDI+. As mentioned earlier pens are used to draw lines and curves and the outlines of graphics shapes. A pen draws lines and curves with a specified width and style. The Pen object provided members to set the width and style of a pen. Pens can have various kinds of dashed lines and line fill styles. Actually, the process of drawing a line creates a region in the shape of a widened line, and that region is filled with a brush. The dashed lines of pens are represented by dash styles. The fill styles of lines can be solids or textures depending on the brush used to create a Pen object.

In this section we will discuss how to create and use pens in GDI+; the Pen and Pens classes; and how to create dash styles, cap styles, and line styles for pens.

Creating Pens

The Pen class represents a pen in GDI+. Using the Pen class constructor, an application can create a Pen object from a Brush or Color object with a specified width for the pen.

Listing 4.15 create pens using Brush and Color objects with and without a specified width.

LISTING 4.15: Using the Pen class constructor to create Pen objects


       
private void Form1_Paint(object sender, PaintEventArgs e)
        {
           
//Create a Graphics object and set it clear
            Graphics g = this.CreateGraphics();
            g.Clear(
this.BackColor);

           
//Create a solid brush and a hatch brush
            SolidBrush blueBrush = new SolidBrush(Color.Blue);
           
HatchBrush hatchBrush = new HatchBrush(HatchStyle.DashedVertical, Color.Black, Color.Green);

           
//Create a pen from a solid brush with width 3
            Pen pn1 = new Pen(blueBrush, 3);

           
//Create a pen from a hatch brush
            Pen pn2 = new Pen(hatchBrush, 8);

           
//Create a pen from a Color structure
            Pen pn3 = new Pen(Color.Red);

           
//Draw a line, ellipse, and rectangle
            g.DrawLine(pn1, new Point(10, 40), new Point(10, 90));
            g.DrawEllipse(pn2, 20, 50, 100, 100);
            g.DrawRectangle(pn3, 40, 90, 100, 100);

           
//Dispose of objects
            pn1.Dispose();
            pn2.Dispose();
            pn3.Dispose();
            blueBrush.Dispose();
            hatchBrush.Dispose();
            g.Dispose();
        }


Figure 4.19 shows the output from Listing 4.15.

The Pens class has static properties for all standard colors, which return appropriately colored Pen objects. The following code snipped creates three Pen objects using the Pens class.

Figure 4.19.jpg

FIGURE 4.19: Creating a using pens

        Pen pn1 = Pens.Red;
        Pen pn2 = Pens.Blue;
        Pen pn3 = Pens.Green;

Pen Class Properties and Methods

The Pen class provides properties to set brush, color, and width programmatically after a Pen object is created. Table 4.8 describes the properties of the Pen class.

Table 4.9 describes the methods of the Pen class.

Pen Types

A pen can draw solid lines, filled lines, texture and even gradient lines – all depending on the brush you use to create the pen. For example, if you use a texture brush to create a pen and then use this pen to create lines, the lines will be texture lines.

The only way to set a pen's type is to create a brush and use that brush to create the pen. The PenType property of the Pen class represents the type of the pen's lines. This property is represented by the PenType enumeration.

Note: The PenType property is read-only property.

Table 4.10 describes the members of the PenType enumeration.

Pens Example

Now let's create a sample application. In Listing 4.16 we create three pens from three different brushes: a solid brush, a texture brush, and a linear gradient brush. After that we create three pens from these brushes, and then we read the type of each pen and display the types in a message box.

TABLE 4.8: Pen class properties

Property

Description

Alignment

Alignment for a pen- a type of PenAlignment enumeration, which is defined in Table 4.11.

Brush

Brush object attached with a pen. Setting the Color property after Brush will replace the color of the current brush with the specified color.

Color

Color of a pen. Setting the Brush property after Color will update the color of a pen to the color of the brush.

CompoundArray

Specifies values of a compound pen, which draws compound lines made up of parallel lines and spaces.

CustomEndCap, CustomStartCap, DashCap

A line drawn by a pen can have custom staring and ending caps. The CustomEndCap and CutomerStartCap properties represent the ending and starting caps, respectively, of lines drawn by a pen. DashCap is used for dashed lines.

DashOffset

The distance from the start of a line to the beginning of a dash pattern.

DashPattern

An array of custom dashes and spaces.

DashStyle

The style used for dashed lines.

EndCap, StartCap

Ending and starting cap of a line.

LineJoin

The join style for the ends of two consecutive lines.

MiterLimit

Limit of the thickness of the join on a mitered corner.

PenType

The style of lines of a pen. This property is represented by the PenType enumeration.

Transform

The geometric transformation of a pen.

Width

The width of a pen.

TABLE 4.9: Pen class methods

Property

Description

Clone

Create an exact copy of a pen.

MultiplyTransform

Multiplies the transformation matrix of a pen by Matrix.

ResetTransform

Resets the geometric transformation by the specified angle.

RotateTransform

Rotates the local geometric transformation by the specified angle.

ScaleTransform

Scales the local geometric transformation by the specified factors.

SetLineCap

Sets the values that determine the style of cap used to end lines drawn by a pen.

TranslateTransform

Translates the local geometric transformation by the specified dimensions.

TABLE 4.10: PenType members

Member

Description

HatchFill

A hatch fill

LinearGradient

A linear gradient fill

PathGradient

A path gradient fill

SolidColor

A solid fill

TextureFill

A bitmap texture fill

LISTING 4.16: Getting pen types


       
private void Form1_Paint(object sender, PaintEventArgs e)
        {
            
//Create a Graphics object
            Graphics g = this.CreateGraphics();
            g.Clear(
this.BackColor);

           
//Create three different types of brushes
            Image img = new Bitmap("D:/VB.NET Basic Practice Projects/WindowsApplication8/Images/Image.GIF");
           
SolidBrush redBrush = new SolidBrush(Color.Red);
           
TextureBrush txtrBrush = new TextureBrush(img);
           
LinearGradientBrush lgBrush = new LinearGradientBrush( new Rectangle(10, 10, 10, 10),
               
Color.Red, Color.Black, 45.0f);

           
//Create pens from brushes
            Pen pn1 = new Pen(redBrush, 4);
           
Pen pn2 = new Pen(txtrBrush, 20);
           
Pen pn3 = new Pen(lgBrush, 20);

           
//Drawing objects
            g.DrawEllipse(pn1, 100, 100, 50, 50);
            g.DrawRectangle(pn2, 80, 80, 100, 100);
            g.DrawEllipse(pn3, 30, 30, 200, 200);

           
//Get pen types
            string str = "Pen1 Type: " +
                             pn1.PenType.ToString() +
"\n";
            str +=
"Pen2 Type : " +
                             pn2.PenType.ToString() +
"\n";
            str +=
"Pen3 Type : " +
                             pn3.PenType.ToString();
           
MessageBox.Show(str);

           
//Dispose of objects
            pn1.Dispose();
            pn2.Dispose();
            pn3.Dispose();
            redBrush.Dispose();
            txtrBrush.Dispose();
            lgBrush.Dispose();
            img.Dispose();
            g.Dispose();
        }


Figure 4.20 shows the output from Listing 4.16.

Figure 4.20.jpg

FIGURE 4.20: Displaying pen types
 
Conclusion

Hope the article would have helped you in understanding using Pens in GDI+. Read other articles on GDI+ on the website.

bookGDI.jpg
This book teaches .NET developers how to work with GDI+ as they develop applications that include graphics, or that interact with monitors or printers. It begins by explaining the difference between GDI and GDI+, and covering the basic concepts of graphics programming in Windows.


Similar Articles
Mindcracker
Founded in 2003, Mindcracker is the authority in custom software development and innovation. We put best practices into action. We deliver solutions based on consumer and industry analysis.