科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件设计带图标和自定义颜色的ListBox

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在一个点对点文件传输的项目中,我需要显示文件传输的实时信息

作者:yzx110 来源:论坛 2007年11月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
为了使它支持图标和多种颜色添加如下成员

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章