Where's the ImageCombo control?






4.82/5 (39 votes)
Jan 10, 2004
1 min read

288984

5281
ImageCombo control for .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)