WinForms FAQ - Pens

With a wide pen, how can I control how the endpoints of my line appear

The LineCap property of the Pen class controls how the ends of your line segments appear. You can set each end independently using the StartCap and EndCap properties of the Pen class. The following code segment produces the picture below.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
 {
   Pen redPen = new Pen(Color.LightSalmon, 20);
   int startX = 80;
   int startY = 30;
   int width = this.ClientSize.Width - 2 * startX;
 Font _font = new Font("Arial Black", 13);
 foreach(LineCap LC in new LineCap[] { LineCap.ArrowAnchor,
           LineCap.DiamondAnchor,
           LineCap.Flat,
           LineCap.Round,
           LineCap.RoundAnchor,
           LineCap.Square,
           LineCap.SquareAnchor,
           LineCap.Triangle})
   {
     redPen.StartCap = LC;
     redPen.EndCap = LC;
     Point p1 = new Point(startX, startY);
     Point p2 = new Point(startX + width, startY);
     e.Graphics.DrawLine(redPen, p1, p2); e.Graphics.DrawString( LC.ToString(), _font, new SolidBrush(Color.Blue), startX + 40, startY - 13 ); startY +=  50;
 }
 }
Permalink
Using a wide pen, how do I draw a series of line segments with rounded corners

The LineJoin property of the Pen class allows you to specify how two lines should be joined. The following code segment produces the picture below.

  private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
    Pen redPen = new Pen(Color.Red, 20);
      
    int startX = 20;
    int startY = 60;
    int width = this.ClientSize.Width / 17;
    int height = this.ClientSize.Height / 2;

    foreach(LineJoin LJ in new LineJoin[] { LineJoin.Bevel,
                         LineJoin.Miter,
                         LineJoin.Round})
    {
      redPen.LineJoin = LJ;

      Point[] points = {new Point(startX, startY),
                  new Point(startX + width, startY + height),
                  new Point(startX + 2 * width, startY),
                  new Point(startX + 3 * width, startY + height),
                  new Point(startX + 4 * width, startY)};

      e.Graphics.DrawLines(redPen, points);
      e.Graphics.DrawString( LJ.ToString(), new Font('Arial Black', 13), 
        new SolidBrush(Color.Blue), startX - 5, startY - 50);
      startX += 4 * width + 40;
    }
  }
Permalink