using System;
using System.Drawing;
namespace System.Windows.Forms
{
/// <summary>
/// 带图标的下拉框
/// 修改者:周鼎汉
/// 修改时间:2007.06.08
/// 修改部分:修改了ImageComboItem中的构造方法
/// 添加了显示的缩进层次属性,在代码
/// 修改了画图片和文字的位置。
/// </summary>
public class ImageCombo : ComboBox
{
private ImageList imgs = new ImageList();
public ImageCombo()
{
// 设置DrawMode为用户自己控制的方式
this.DrawMode = DrawMode.OwnerDrawFixed;
}
// ImageList属性
public ImageList ImageList
{
get{return imgs;}
set{imgs = value;}
}
// 自定义画ComboBox
protected override void OnDrawItem(DrawItemEventArgs e)
{
// 画背景和焦点区域
e.DrawBackground();
e.DrawFocusRectangle();
// 首先检查是否是一个Item
if (e.Index < 0)
{
// 如果不是直接画文本
e.Graphics.DrawString(this.Text, e.Font, new SolidBrush(e.ForeColor), e.Bounds.Left + imgs.ImageSize.Width, e.Bounds.Top);
}
else
{
// 是否是ImageComboBox
if (this.Items[e.Index].GetType() == typeof(ImageComboItem))
{
//得到要画的项目
ImageComboItem item = (ImageComboItem) this.Items[e.Index];
//得到前景色和字体
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代表没有图片
if (item.ImageIndex != -1)
{
// 画图片,画文本
this.ImageList.Draw(e.Graphics, e.Bounds.Left+item.Level*imgs.ImageSize.Width, e.Bounds.Top, item.ImageIndex);
e.Graphics.DrawString(item.Text, font, new SolidBrush(forecolor), e.Bounds.Left + imgs.ImageSize.Width+item.Level*imgs.ImageSize.Width, e.Bounds.Top);
}
else
{
// 没有图片直接画文本
e.Graphics.DrawString(item.Text, font, new SolidBrush(forecolor), e.Bounds.Left + imgs.ImageSize.Width+item.Level*imgs.ImageSize.Width, e.Bounds.Top);
}
}
else
{
// 如果不是ImageComboBox,那么直接画文本
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);
}
}
/// <summary>
/// 下拉框中的项目
/// </summary>
public class ImageComboItem
{
//前景色继承自系统颜色
private Color forecolor = Color.FromKnownColor(KnownColor.Transparent);
private bool mark = false;
private int imageindex = -1;
private int level=0;
private object tag = null;
private string text = null;
public ImageComboItem()
{
}
public ImageComboItem(string Text) :this(Text,-1)
{
}
public ImageComboItem(string Text,int ImageIndex) :this(Text,ImageIndex,0)
{
}
public ImageComboItem(string Text, int ImageIndex,int Level):this(Text,ImageIndex,Level,false)
{
}
public ImageComboItem(string Text, int ImageIndex, int Level,bool Mark):this(Text,ImageIndex,Level,Mark,Color.FromKnownColor(KnownColor.Transparent))
{
}
public ImageComboItem(string Text, int ImageIndex, int Level,bool Mark, Color ForeColor):this(Text,ImageIndex,Level,Mark,ForeColor,null)
{
}
public ImageComboItem(string Text, int ImageIndex,int Level, bool Mark, Color ForeColor, object Tag)
{
text = Text;
imageindex = ImageIndex;
this.level=Level;
mark = Mark;
forecolor = ForeColor;
tag = Tag;
}
// 前景色
public Color ForeColor
{
get{return forecolor;}
set{forecolor = value;}
}
// 图片索引
public int ImageIndex
{
get{return imageindex;}
set{imageindex = value;}
}
//项目的缩进层次
public int Level
{
get{return this.level;}
set{this.level=value;}
}
// 是否加粗
public bool Mark
{
get{return mark;}
set{mark = value;}
}
// Tag属性
public object Tag
{
get{return tag;}
set{tag = value;}
}
// 项目文本
public string Text
{
get{return text;}
set{text = value;}
}
// ToString() 返回项目文本
public override string ToString()
{
return text;
}
}
}
文章来源: http://blog.sina.com.cn/s/blog_49458c27010008ir.html