LEADTOOLS Windows Forms (Leadtools.WinForms assembly) Send comments on this topic. | Back to Introduction - All Topics | Help Version 17.0.3.30
DrawItem Event
See Also 
Leadtools.WinForms Namespace > RasterImageList Class : DrawItem Event



Occurs when a request is made to draw an item in an owner-drawn RasterImageList.

Syntax

Visual Basic (Declaration) 
Public Event DrawItem As EventHandler(Of RasterImageListDrawItemEventArgs)
Visual Basic (Usage)Copy Code
Dim instance As RasterImageList
Dim handler As EventHandler(Of RasterImageListDrawItemEventArgs)
 
AddHandler instance.DrawItem, handler
C++/CLI 
public:
event EventHandler<RasterImageListDrawItemEventArgs^>^ DrawItem

Event Data

The event handler receives an argument of type RasterImageListDrawItemEventArgs containing data related to this event. The following RasterImageListDrawItemEventArgs properties provide information specific to this event.

PropertyDescription
Graphics The Graphics object into which the item should be drawn.
Item The RasterImageListItem to draw.

Example

This example creates an owner drawn RasterImageList.

Visual BasicCopy Code
Private Class MyForm3 : Inherits Form
      Private imageList As RasterImageList
      Private codecs As RasterCodecs
      Public Sub New(ByVal title As String)
         Text = title
         ' Set the size of the form
         Size = New Size(400, 200)

         ' Create a new RasterImageList control
         imageList = New RasterImageList()
         imageList.Dock = DockStyle.Fill
         imageList.SelectionMode = RasterImageListSelectionMode.Single
         imageList.Size = Size
         Controls.Add(imageList)
         imageList.BringToFront()

         codecs = New RasterCodecs()

         ' Create three items
         Dim imagesPath As String = LEAD_VARS.ImagesDir

         For i As Integer = 0 To 2
            ' Load the image
            Dim index As Integer = i + 1
            Dim imageFileName As String = Path.Combine(imagesPath, "ImageProcessingDemo\Image" & index.ToString() & ".cmp")
            Dim image As RasterImage = codecs.Load(imageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1)
            Dim item As RasterImageListItem = New RasterImageListItem(image, 1, "Item" & index.ToString())

            ' Select the first item
            If i = 0 Then
               item.Selected = True
            End If

            ' Add the item to the image list
            imageList.Items.Add(item)
         Next i

         ' Change the item size
         imageList.ItemSize = New Size(200, 200)

         ' Change the item image size
         imageList.ItemImageSize = New Size(120, 120)

         ' We are going to draw the items ourselves
         imageList.ViewStyle = RasterImageListViewStyle.OwnerDraw

         ' Add a handler to the DrawItem event
         AddHandler imageList.DrawItem, AddressOf rasterImageList_DrawItem

         ' Add the RasterImageList to the control collection.
         Controls.Add(imageList)
      End Sub

      Private Sub rasterImageList_DrawItem(ByVal sender As Object, ByVal e As RasterImageListDrawItemEventArgs)
         Dim item As RasterImageListItem = e.Item
         Dim imageList As RasterImageList = item.ImageList
         Dim g As Graphics = e.Graphics

         ' get the item rectangle
         Dim rc As Rectangle = imageList.GetItemRectangle(item)

         ' sanity check
         If rc.IsEmpty Then
            Return
         End If

         ' we want to draw a 1 pixel black rectangle around the item
         ' then we fill the inside of the rectangle with white if the item
         ' is not selected or lightgray if it is

         g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width - 1, rc.Height - 1)

         ' we used up 1 pixel
         rc.Inflate(-1, -1)

         Dim b As Brush
         If item.Selected Then
            b = Brushes.LightGray
         Else
            b = Brushes.White
         End If
         g.FillRectangle(b, rc)

         ' calculate the rectangles for image and text
         If imageList.ShowItemText Then
            ' text is visible
            ' draw the text at the bottom of the item
            Dim textHeight As Integer = CInt(g.MeasureString("WWW", imageList.Font).Height + 4)
            Dim textRect As Rectangle = Rectangle.FromLTRB(rc.Left, rc.Bottom - textHeight, rc.Right, rc.Bottom)

            If (Not textRect.IsEmpty) Then
               Dim sf As StringFormat = New StringFormat()
               sf.Alignment = StringAlignment.Center
               sf.LineAlignment = StringAlignment.Center
               sf.Trimming = StringTrimming.EllipsisPath
               sf.FormatFlags = StringFormatFlags.NoWrap

               g.DrawString(item.Text, imageList.Font, Brushes.Black, textRect, sf)
               sf.Dispose()

               ' we need to update the item rectangle for the space
               ' we used up to draw the text
               rc.Height -= textRect.Height
            End If
         End If

         ' rc is the image rectangle
         If (Not rc.IsEmpty) Then
            ' now rc holds the rectangle to draw the image into

            ' first, set the correct page
            Dim savePage As Integer = -1
            If item.Image.Page <> item.Page Then
               ' the page is different

               ' save current image page so we can set it back when we are done
               savePage = item.Image.Page

               ' disable the image events, we are going to set the page back,
               ' so we do not want anybody subscribing to this image Changed
               ' event to know we changed it.
               item.Image.DisableEvents()

               ' set new page
               item.Image.Page = item.Page
            End If

            Try
               ' we want to center the image into whatever left of rc
               Dim itemImageSize As Size = imageList.ItemImageSize
               Dim imageRect As Rectangle = New Rectangle(rc.Left + (rc.Width - itemImageSize.Width) \ 2, rc.Top + (rc.Height - itemImageSize.Height) \ 2, itemImageSize.Width, itemImageSize.Height)

               ' we want to keep the aspect ratio
               imageRect = RasterImageList.GetFixedAspectRatioImageRectangle(item.Image.ImageWidth, item.Image.ImageHeight, imageRect)

               ' draw the image
               Dim lRect As LeadRect = New LeadRect(imageRect.Left, imageRect.Top, imageRect.Width, imageRect.Height)
               RasterImagePainter.Paint(item.Image, e.Graphics, lRect, imageList.PaintProperties)

               ' finally, draw a black rectangle around the image
               imageRect.Inflate(1, 1)
               g.DrawRectangle(Pens.Black, imageRect.Left, imageRect.Top, imageRect.Width - 1, imageRect.Height - 1)
            Finally
               ' reset the old page
               If savePage <> -1 Then
                  item.Image.Page = savePage

                  ' re-enable the events
                  item.Image.EnableEvents()
               End If
            End Try
         End If
      End Sub
   End Class

   Public Sub RasterImageList_DrawItem(ByVal title As String)
      Dim form As MyForm3 = New MyForm3(title)
      form.ShowDialog()
   End Sub

Public NotInheritable Class LEAD_VARS
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
C#Copy Code
class MyForm3 : Form
   {
      RasterImageList imageList;
      RasterCodecs codecs;
      public MyForm3(string title)
      {
         Text = title;
         // Set the size of the form
         Size = new Size(400, 200);

         // Create a new RasterImageList control
         imageList = new RasterImageList();
         imageList.Dock = DockStyle.Fill;
         imageList.SelectionMode = RasterImageListSelectionMode.Single;
         imageList.Size = Size;
         Controls.Add(imageList);
         imageList.BringToFront();

         codecs = new RasterCodecs();

         // Create three items
         string imagesPath = LEAD_VARS.ImagesDir;

         for(int i = 0; i < 3; i++)
         {
            // Load the image
            int index = i + 1;
            string imageFileName = Path.Combine(imagesPath, @"ImageProcessingDemo\Image" + index.ToString() + ".cmp");
            RasterImage image = codecs.Load(imageFileName, 0, CodecsLoadByteOrder.BgrOrGray, 1, 1);
            RasterImageListItem item = new RasterImageListItem(image, 1, "Item" + index.ToString());

            // Select the first item
            if(i == 0)
               item.Selected = true;

            // Add the item to the image list
            imageList.Items.Add(item);
         }

         // Change the item size
         imageList.ItemSize = new Size(200, 200);

         // Change the item image size
         imageList.ItemImageSize = new Size(120, 120);

         // We are going to draw the items ourselves
         imageList.ViewStyle = RasterImageListViewStyle.OwnerDraw;

         // Add a handler to the DrawItem event
         imageList.DrawItem += new EventHandler<RasterImageListDrawItemEventArgs>(rasterImageList_DrawItem);

         // Add the RasterImageList to the control collection.
         Controls.Add(imageList);
      }

      private void rasterImageList_DrawItem(object sender, RasterImageListDrawItemEventArgs e)
      {
         RasterImageListItem item = e.Item;
         RasterImageList imageList = item.ImageList;
         Graphics g = e.Graphics;

         // get the item rectangle
         Rectangle rc = imageList.GetItemRectangle(item);

         // sanity check
         if(rc.IsEmpty)
            return;

         // we want to draw a 1 pixel black rectangle around the item
         // then we fill the inside of the rectangle with white if the item
         // is not selected or lightgray if it is

         g.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width - 1, rc.Height - 1);

         // we used up 1 pixel
         rc.Inflate(-1, -1);

         Brush b;
         if(item.Selected)
            b = Brushes.LightGray;
         else
            b = Brushes.White;
         g.FillRectangle(b, rc);

         // calculate the rectangles for image and text
         if(imageList.ShowItemText)
         {
            // text is visible
            // draw the text at the bottom of the item
            int textHeight = (int)(g.MeasureString("WWW", imageList.Font).Height + 4);
            Rectangle textRect = Rectangle.FromLTRB(
               rc.Left,
               rc.Bottom - textHeight,
               rc.Right,
               rc.Bottom);

            if(!textRect.IsEmpty)
            {
               StringFormat sf = new StringFormat();
               sf.Alignment = StringAlignment.Center;
               sf.LineAlignment = StringAlignment.Center;
               sf.Trimming = StringTrimming.EllipsisPath;
               sf.FormatFlags = StringFormatFlags.NoWrap;

               g.DrawString(
                  item.Text,
                  imageList.Font,
                  Brushes.Black,
                  textRect,
                  sf);
               sf.Dispose();

               // we need to update the item rectangle for the space
               // we used up to draw the text
               rc.Height -= textRect.Height;
            }
         }

         // rc is the image rectangle
         if(!rc.IsEmpty)
         {
            // now rc holds the rectangle to draw the image into

            // first, set the correct page
            int savePage = -1;
            if(item.Image.Page != item.Page)
            {
               // the page is different

               // save current image page so we can set it back when we are done
               savePage = item.Image.Page;

               // disable the image events, we are going to set the page back,
               // so we do not want anybody subscribing to this image Changed
               // event to know we changed it.
               item.Image.DisableEvents();

               // set new page
               item.Image.Page = item.Page;
            }

            try
            {
               // we want to center the image into whatever left of rc
               Size itemImageSize = imageList.ItemImageSize;
               Rectangle imageRect = new Rectangle(
                  rc.Left + (rc.Width - itemImageSize.Width) / 2,
                  rc.Top + (rc.Height - itemImageSize.Height) / 2,
                  itemImageSize.Width,
                  itemImageSize.Height);

               // we want to keep the aspect ratio
               imageRect = RasterImageList.GetFixedAspectRatioImageRectangle(
                  item.Image.ImageWidth,
                  item.Image.ImageHeight,
                  imageRect);

               // draw the image
               LeadRect lRect = new LeadRect(imageRect.Left, imageRect.Top, imageRect.Width, imageRect.Height);
               RasterImagePainter.Paint(item.Image, e.Graphics, lRect, imageList.PaintProperties);

               // finally, draw a black rectangle around the image
               imageRect.Inflate(1, 1);
               g.DrawRectangle(
                  Pens.Black,
                  imageRect.Left,
                  imageRect.Top,
                  imageRect.Width - 1,
                  imageRect.Height - 1);
            }
            finally
            {
               // reset the old page
               if(savePage != -1)
               {
                  item.Image.Page = savePage;

                  // re-enable the events
                  item.Image.EnableEvents();
               }
            }
         }
      }
   }

   public void RasterImageList_DrawItem(string title)
   {
      MyForm3 form = new MyForm3(title);
      form.ShowDialog();
   }

static class LEAD_VARS
{
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}

Remarks

When you set the ViewStyle property to RasterImageListViewStyle.OwnerDraw, the RasterImageList control will fire the DrawItem event for each event that needs to be drawn. The RasterImageListDrawItemEventArgs argument passed to a DrawItem event handler provides a System.Drawing.Graphics object that enables you to perform drawing and other graphical operations on the surface of the RasterImageList along with the RasterImageListItem object that needs to be drawn.

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7

See Also