Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Where's the ImageCombo control?

0.00/5 (No votes)
18 Jan 2004 1  
ImageCombo control for .NET.

Sample Image - ImageCombo.NET

Introduction

When I started programming in .NET, I wondered where the ImageCombo control had gone (I used to program in VB6). The .NET Framework didn't seem to have this functionality built-in, but it's very easy to add it.

Using the code

The code consists of two classes: ImageCombo and ImageComboItem. If you want to use them in C#, just copy them into your project; for other .NET languages, you can add a reference to the library.

The control inherits from ComboBox and introduces one new member: the ImageList property, which doesn't require any further explanation. The control is owner drawn and there is a custom drawing method defined, so don't change its DrawMode property if you want to see the images.

The ImageComboItem class inherits from Object. You can set a customForeColor and it has a Mark property which determines if the item is shown in bold font style (does not work if owner font is already bold).

To add an item to an ImageCombo with text "Icon 0" and image index 0, use the following code:

imageCombo.Items.Add(new ImageComboItem("Icon 0", 0));

Code listing: ImageCombo class

using System;
using System.Drawing;

namespace System.Windows.Forms
{

    public class ImageCombo : ComboBox
    {
        private ImageList imgs = new ImageList();

        // constructor

        public ImageCombo()
        {
            // set draw mode to owner draw

            this.DrawMode = DrawMode.OwnerDrawFixed;    
        }

        // ImageList property

        public ImageList ImageList 
        {
            get 
            {
                return imgs;
            }
            set 
            {
                imgs = value;
            }
        }

        // customized drawing process

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            // draw background & focus rect

            e.DrawBackground();
            e.DrawFocusRectangle();

            // check if it is an item from the Items collection

            if (e.Index < 0)

                // not an item, draw the text (indented)

                e.Graphics.DrawString(this.Text, e.Font, 
                        new SolidBrush(e.ForeColor), e.Bounds.Left + 
                        imgs.ImageSize.Width, e.Bounds.Top);

            else
            {
                
                // check if item is an ImageComboItem

                if (this.Items[e.Index].GetType() == typeof(ImageComboItem)) 
                {                                                            

                    // get item to draw

                    ImageComboItem item = (ImageComboItem) 
                        this.Items[e.Index];

                    // get forecolor & font

                    Color forecolor = (item.ForeColor != 
                         Color.FromKnownColor(KnownColor.Transparent)) ? 
                         item.ForeColor : e.ForeColor;
                    Font font = item.Mark ? new Font(e.Font, 
                         FontStyle.Bold) : e.Font;

                    // -1: no image

                    if (item.ImageIndex != -1) 
                    {
                        // draw image, then draw text next to it

                        this.ImageList.Draw(e.Graphics, 
                           e.Bounds.Left, e.Bounds.Top, item.ImageIndex);
                        e.Graphics.DrawString(item.Text, font, 
                           new SolidBrush(forecolor), e.Bounds.Left + 
                           imgs.ImageSize.Width, e.Bounds.Top);
                    }
                    else
                        // draw text (indented)

                        e.Graphics.DrawString(item.Text, font, 
                            new SolidBrush(forecolor), e.Bounds.Left + 
                            imgs.ImageSize.Width, e.Bounds.Top);

                }
                else
                
                    // it is not an ImageComboItem, draw it

                    e.Graphics.DrawString(this.Items[e.Index].ToString(), 
                      e.Font, new SolidBrush(e.ForeColor), e.Bounds.Left + 
                      imgs.ImageSize.Width, e.Bounds.Top);
                
            }

            base.OnDrawItem (e);
        }
        
    }

}

Code listing: ImageComboItem class

using System;
using System.Drawing;

namespace System.Windows.Forms
{

    public class ImageComboItem : object
    {
        // forecolor: transparent = inherit

        private Color forecolor = Color.FromKnownColor(
                KnownColor.Transparent);
        private bool mark = false;
        private int imageindex = -1;
        private object tag = null;
        private string text = null;        
        
        // constructors

        public ImageComboItem()
        {
        }

        public ImageComboItem(string Text) 
        {
            text = Text;    
        }

        public ImageComboItem(string Text, int ImageIndex)
        {
            text = Text;
            imageindex = ImageIndex;
        }

        public ImageComboItem(string Text, int ImageIndex, bool Mark)
        {
            text = Text;
            imageindex = ImageIndex;
            mark = Mark;
        }

        public ImageComboItem(string Text, int ImageIndex, 
            bool Mark, Color ForeColor)
        {
            text = Text;
            imageindex = ImageIndex;
            mark = Mark;
            forecolor = ForeColor;
        }

        public ImageComboItem(string Text, int ImageIndex, 
               bool Mark, Color ForeColor, object Tag)
        {
            text = Text;
            imageindex = ImageIndex;
            mark = Mark;
            forecolor = ForeColor;
            tag = Tag;
        }

        // forecolor

        public Color ForeColor 
        {
            get 
            {
                return forecolor;
            }
            set
            {
                forecolor = value;
            }
        }

        // image index

        public int ImageIndex 
        {
            get 
            {
                return imageindex;
            }
            set 
            {
                imageindex = value;
            }
        }

        // mark (bold)

        public bool Mark
        {
            get
            {
                return mark;
            }
            set
            {
                mark = value;
            }
        }

        // tag

        public object Tag
        {
            get
            {
                return tag;
            }
            set
            {
                tag = value;
            }
        }

        // item text

        public string Text 
        {
            get
            {
                return text;
            }
            set
            {
                text = value;
            }
        }
        
        // ToString() should return item text

        public override string ToString() 
        {
            return text;
        }

    }

}

History

  • Original code (01/10/2004)
  • Optimized code for speed & added some functionality (18/10/2004)

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here