庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>C#语言>界面与窗体>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

设计带图标和自定义颜色的ListBox

 作者:yzx110    日期:2005-8-8 9:50:40
字号选择〖 〗/ 双击滚屏 单击停止   

  在一个点对点文件传输的项目中,我需要显示文件传输的实时信息:传输的文件列表和当前传输的文件,当时我想到了用ListBox,但是但我用了ListBox后,我发现它不能改变控件中文本想的颜色,于是我就想扩展一下ListBox控件------ListBoxEx。

  我的目标是给空间加上图标,还要能时时改变控件文本颜色。于是从ListBox派生类

public class ListBoxEx : ListBox {…}

  为了操作方便我为ListBoxEx的每一项设计专门的类ListBoxExItem

 

public class ListBoxExItem {…}

  为了保持我这个控件与WinForm的标准控件的操作借口一致,我又重新设计了两个集合类:

 

public class ListBoxExItemCollection : IList, ICollection, IEnumerator {}
//这个类相对于标准ListBox中的ObjectCollection,这个类作为ListBoxEx中的Items属性的类型

public class SelectedListBoxExItemCollection : : IList, ICollection, IEnumerator{}
//这个类相对于标准ListBox中的SelectedObjectCollection,这个类作为ListBoxEx中的SelectedItems属性的类型

  下面看两个集合类的实现:

  ListBoxExItemCollection的实现:为了做到对集合(Items)的操作能够及时反映到ListBoxEx的控件中所以,此类只是对ListBox中Items(ObjectCollection类型)作了一层包装,就是把ListBox中Items属性的所有方法的只要是object类型的参数都转换成ListBoxExItem,比如:

 

public void Remove(ListBoxExItem item)
{
 this._Items.Remove(item); //_Items为ObjectCollection类型
}

public void Insert(int index, ListBoxExItem item)
{
 this._Items.Insert(index, item);
}

public int Add(ListBoxExItem item)
{
 return this._Items.Add(item);
}

  由上可知,ListBoxExItemCollection中有一个构造函数来传递ListBox中的Items对象

 

private ObjectCollection _Items;

public ListBoxExItemCollection(ObjectCollection baseItems)
{
 this._Items = baseItems;
}

  而SelectedListBoxExItemCollection类的实现也用同样的方法,只不过是对SelectedObjectCollection包装罢了。

  集合实现后,再来看ListBoxExItem的实现:

  为了使它支持图标和多种颜色添加如下成员
 

private int _ImageIndex;

public int ImageIndex
{
 get { return this._ImageIndex; }
 set { this._ImageIndex = value;}
}

private Color _ForeColor;

public Color ForeColor
{
 get{ return this._ForeColor;}
 set
 {
  this._ForeColor = value;
  this.Parent.Invalidate();
 }
}

  当然还有:

 

private string _Text;

public string Text
{
 get { return this._Text; }
 set { this._Text = value; }
}

  为了控件能正确显示此项的文本,还必须重写ToString()方法

 

public override string ToString()
{
 return this._Text;
}

  再看ListBoxEx的实现:

  为了使控件能够自我绘制,所以:DrawMode = DrawMode.OwnerDrawFixed;

  为了覆盖基类的Items等相关属性添加

 

private ListBoxExItemCollection _Items; //在构造函数中创建

  同时还需要重写属性Items:

 

new public ListBoxExItemCollection Items
{
 get
 {
  return this._Items;
 }
}

new public ListBoxExItem SelectedItem //强制转换为ListBoxExItem
{
 get{ return base.SelectedItem as ListBoxExItem;}
 set{ base.SelectedItem = value;}
}

new public SelectedListBoxExItemCollection SelectedItems //重新包装SelectedItems
{
 get
 {
  return new SelectedListBoxExItemCollection(base.SelectedItems);
 }
}

  为了支持图标,添加一个图像列表imagelist

 

private ImageList imageList;

public ImageList ImageList
{
 get { return this.imageList; }
 set
 {
  this.imageList = value;
  this.Invalidate();//图像列表改变后马上更新控件
 }
}

  而此控件的核心却在一个方法OnDrawItem,这个方法每当控件的项需要重绘时就被调用

 

protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs pe)
{
 pe.DrawBackground(); //画背景
 pe.DrawFocusRectangle(); //画边框
 Rectangle bounds = pe.Bounds;

 // Check whether the index is valid

if(pe.Index >= 0 && pe.Index < base.Items.Count)
{
 ListBoxExItem item = this.Items[pe.Index]; //取得需要绘制项的引用
 int iOffset = 0;

// If the image list is present and the image index is set, draw the image

 if(this.imageList != null)
 {
  if (item.ImageIndex > -1 && item.ImageIndex < this.imageList.Images.Count)
  {
    this.imageList.Draw(pe.Graphics, bounds.Left, bounds.Top, bounds.Height, bounds.Height, item.ImageIndex); //绘制图标
  }
  iOffset += bounds.Height;//this.imageList.ImageSize.Width;
 }

 // Draw item text

 pe.Graphics.DrawString(item.Text, pe.Font, new SolidBrush(item.ForeColor),bounds.Left + iOffset, bounds.Top); //根据项的颜色绘制文本

 }
 base.OnDrawItem(pe);
 }
}

  到此为止,ListBoxEx以完整的实现,并且支持可视化设计

上一篇:C#中为DataGrid添加下拉列表框    下一篇:C# Builder WinForm开发入门  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: yzx110
信息来源: 网络 录入时间: 2005-8-8 9:50:40
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿