January 27, 2020
Hot Topics:

Visualizing LINQ Sequences with GDI+

  • February 4, 2008
  • By Paul Kimmel
  • Send Email »
  • More Articles »

Listing 4: The DrawSequenceState class that contains the sequence and the call using the RectangleManager to represent that sequence.

Imports System.Drawing

Public Class DrawSequenceState
   Inherits MyStatePattern

   ''' <summary>
   ''' Initializes a new instance of the DrawSequenceState class.
   ''' </summary>
   Public Sub New(ByVal pen As Pen)
   End Sub

   Public Overrides Sub Draw(ByVal Graphics As _
      System.Drawing.Graphics, _
      ByVal Font As System.Drawing.Font)
      Dim i = New Integer() {1, 2, 3, 4, 5, 6, 7, 8, 9}
      Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

      Dim r As Rectangle = New Rectangle(10, 50, 200, 50)
      Graphics.DrawRectangle(MyPen, r)
      Dim result = From o In i Where o Mod 2 = 0 Select o

      Dim instance As RectangleManager = _
         New RectangleManager(r, result.Count, 1)

      For x = 0 To result.Count - 1

         Dim f As Rectangle = instance.GetSubRect(x, 0)
         Graphics.FillEllipse(Brushes.Lavender, f.X, f.Y, _
            f.Width, f.Height)
         Graphics.DrawEllipse(Pens.Black, f.X, f.Y, _
            f.Width, f.Height)
         Dim t As Rectangle = instance.GetSubRect(x, 0)

         Dim s As SizeF = Graphics.MeasureString( _
            result.ElementAt(x).ToString(), Font)
         Dim textRect As Rectangle = Rectangles.CenterRect(s, t)
         Graphics.DrawString(result.ElementAt(x).ToString(), _
            Font, _
            Brushes.Blue, textRect.X, textRect.Y)

   End Sub
End Class

The LINQ query is shown in Listing 4 on the line Dim result = From o In i Where o Mod 2 = 0 Select 0. This query selects the even numbered integers as shown in Figure 1.

Figure 1: The results of the LINQ query returning even numbers in a set of integers 0 through 8.

The base class for the state pattern MyStatePattern is shown in Listing 5.

Listing 5: The abstract base class for the state pattern.

Public MustInherit Class MyStatePattern

   Private FMyPen As Pen
   Public Property MyPen() As Pen
         Return FMyPen
      End Get
      Set(ByVal Value As Pen)
         FMyPen = Value
      End Set
   End Property

   Public Sub New(ByVal pen As Pen)
      FMyPen = pen
   End Sub

   Public MustOverride Sub Draw(ByVal Graphics As Graphics, _
      ByVal Font As Font)

End Class


Everything is Rectangles in a 2D rectilinear world. In this article, I demonstrated how you can draw specific rectangular sub-regions as rectangles or ellipses (or really as anything that is constrained by a rectangular region). That was followed by an application of this technique that visualizes LINQ queries. I hope you find the code useful.

About the Author

Paul Kimmel is the VB Today columnist for www.codeguru.com and has written several books on object-oriented programming and .NET. Check out his upcoming book LINQ Unleashed for C# due in Spring 2008. You may contact him for technology questions at pkimmel@softconcepts.com.

If you are interested in joining or sponsoring a .NET Users Group, check out www.glugnet.org. Glugnet opened a users group branch in Flint, Michigan in August 2007. If you are interested in attending, check out the www.glugnet.org web site for updates.

Copyright © 2008 by Paul T. Kimmel. All Rights Reserved.

Page 3 of 3

Enterprise Development Update

Don't miss an article. Subscribe to our newsletter below.

Thanks for your registration, follow us on our social networks to keep up-to-date