知识大全 C#设计带图标和自定义颜色的ListBox

Posted

篇首语:采得百花成蜜后,为谁辛苦为谁甜。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#设计带图标和自定义颜色的ListBox相关的知识,希望对你有一定的参考价值。

C#设计带图标和自定义颜色的ListBox  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在一个点对点文件传输的项目中 我需要显示文件传输的实时信息 传输的文件列表和当前传输的文件 当时我想到了用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 >= && pe Index < base Items Count) ListBoxExItem item = this Items[pe Index]; //取得需要绘制项的引用 int iOffset = ;

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

  if(this imageList != null)   if (item ImageIndex > && 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); 

cha138/Article/program/net/201311/11713

相关参考

知识大全 Asp.net的处理机制和自定义WebServer

Asp.net的处理机制和自定义WebServer  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 ASP.NET入门教程 10.8程序集和自定义服务器控件

ASP.NET入门教程10.8程序集和自定义服务器控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 怎么才能随便更换系统图标比如我的电脑回收站,或者是一些文件夹。不是系统带的。我自己在网上下载的

怎么才能随便更换系统图标比如我的电脑回收站,或者是一些文件夹。不是系统带的。我自己在网上下载的!这个容易,如果想更改回收站的图标,按以下步骤:右击桌面,选择属性,点桌面——自定义桌面——点那里的回收站

知识大全 C#下实现动态系统托盘图标

C#下实现动态系统托盘图标  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一概述  我这里所指的

知识大全 C#设计模式之简单工厂篇

C#设计模式之简单工厂篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先定义一个接口具体名为

知识大全 列出C#进程以及详细信息

列出C#进程以及详细信息  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!建立一个listBox将进程

知识大全 c# 实现自定义属性改变触发自定义事件

  代码内含说明(界面是两个文本框textboxtextbox和一个button界面的Load事件button的click事件)usingSystem;usingSystemCollectionsGe

知识大全 用VC设计托盘图标程序

用VC设计托盘图标程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在Windows操作系统中

知识大全 全面剖析C#接口编程之定义接口

全面剖析C#接口编程之定义接口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从技术上讲接口是一

知识大全 自定义事件实现不同窗体间的通讯C#篇

自定义事件实现不同窗体间的通讯C#篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#中的事件