带图标和自定义颜色的ListBox yzx110 [原作]

转载 2004年07月01日 09:59:00
  带图标和自定义颜色的ListBox     yzx110 [原作]
关键字   ListBox
出处  

自定义控件的实现

   --------带图标和自定义颜色的ListBox

在一个点对点文件传输的项目中,我需要显示文件传输的实时信息:传输的文件列表和当前传输的文件,当时我想到了用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的控件中所以,此类只是对ListBoxItems(ObjectCollection类型)作了一层包装,就是把ListBoxItems属性的所有方法的只要是object类型的参数都转换成ListBoxExItem,比如:

                     public void Remove(ListBoxExItem item)

                     {

                            this._Items.Remove(item); //_ItemsObjectCollection类型

                     }

                     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以完整的实现,并且支持可视化设计。

如果需要完整代码,请联系yzx110@bit.edu.cn

 

CIconListBox带图标的列表框类

有时候,我们需要在列表框ListBox中插入带图标的文字项,这就需要自己派生一个类出来了,网上的一个CIconListBox类还不错...
  • akof1314
  • akof1314
  • 2010年11月08日 11:06
  • 5157

带图标和自定义颜色的ListBox

自定义控件的实现   --------带图标和自定义颜色的ListBox在一个点对点文件传输的项目中,我需要显示文件传输的实时信息:传输的文件列表和当前传输的文件,当时我想到了用ListBox,但是但...
  • yzx110
  • yzx110
  • 2004年05月12日 18:31
  • 1427

【自绘ListBox】带图标的ListBox

示例图片源码下载源码下载 示例程序下载使用说明提供的接口如下:void SetImageList(CImageList* pImageList); CImageList* GetImageList(...
  • wangyao1052
  • wangyao1052
  • 2015年05月17日 10:22
  • 1717

C# 编写带图标和tooltip的ListBox

上午刚写了一篇关于带ToolTip的ListBox控件,这一篇是针对所有项,无论项文本长度有无超出控件,都会呈现ToolTip。现在这一篇基础上加一些限制并引进图标显示,只对超出部分的项才呈现Tool...
  • small5e4444
  • small5e4444
  • 2014年01月17日 10:27
  • 578

C# Winform编程ListBox之添加图标

private void listBox_DrawItem(object sender, DrawItemEventArgs e) { Brush myBrus...
  • educast
  • educast
  • 2012年04月16日 11:30
  • 2482

【自绘ListBox之一】带Icon的ListBox控件

参考: CListBoxST源码 Demo源程序: CIconListBox_demo Demo程序图片: 使用示例: 手动更改ListBox控件的属性如下,因为以下特性不能通过代码动态修改。 m...
  • wangyao1052
  • wangyao1052
  • 2012年11月17日 21:33
  • 1935

C#实现item自定义颜色的ListBox,显示日志

一、说明 ListBox自身的OnDrawItem函数是专门绘制item样式的,只需要重载即可 protected override void OnDrawItem(DrawItemEventAr...
  • hopedream2008
  • hopedream2008
  • 2017年12月04日 17:20
  • 118

MFC之ListBox控件样式扩展

MFC中有许多控件,将控件拖到窗口中右键鼠标,点击属性,到样式标签页中会有很多样式可以选择 但是往往这些样式会满足不了我们的需求,这时候,我们需要自己来完成我们想要的样式控件 我们就来拿ListB...
  • iq19900204
  • iq19900204
  • 2011年09月27日 00:44
  • 4663

自定义WPF ListBox的选择样式

http://winsystem.ctocio.com.cn/407/12166907.shtml (下图:进行多项选择的ListBox)   首先介绍一种简单地方法:就是通过自定义Sys...
  • mituan1234567
  • mituan1234567
  • 2013年05月15日 08:49
  • 1056

让ListBox控件每一行显示不同的颜色

最近用MFC做个小项目,想要让ListBox中的每一行都根据自定义的颜色来显示不同的颜色。刚开始把MFC想的太简单了,拖了一个ListBox控件然后绑定了一个变量m_ListBox。 在主对话框的O...
  • bcypxl
  • bcypxl
  • 2013年12月03日 14:47
  • 3959
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:带图标和自定义颜色的ListBox yzx110 [原作]
举报原因:
原因补充:

(最多只允许输入30个字)