大力水手的Blog

大力水手语录

导航

[导入]带图标的下拉框

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

posted on 2008-05-01 09:07  jack.zhou  阅读(585)  评论(0编辑  收藏  举报