熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#設計帶圖標和自定義顏色的ListBox

2013-11-13 09:50:32  來源: .NET編程 

  在一個點對點文件傳輸的項目中我需要顯示文件傳輸的實時信息傳輸的文件列表和當前傳輸的文件當時我想到了用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_ItemsRemove(item); //_Items為ObjectCollection類型
}

  public void Insert(int index ListBoxExItem item)
{
 this_ItemsInsert(index item);
}

  public int Add(ListBoxExItem item)
{
 return this_ItemsAdd(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;
  thisParentInvalidate();
 }
}

  當然還有

  private string _Text;

  public string Text
{
 get { return this_Text; }
 set { this_Text = value; }
}

  為了控件能正確顯示此項的文本還必須重寫ToString()方法

  public override string ToString()
{
 return this_Text;
}

  再看ListBoxEx的實現:

  為了使控件能夠自我繪制所以DrawMode = DrawModeOwnerDrawFixed;

  為了覆蓋基類的Items等相關屬性添加

  

  private ListBoxExItemCollection _Items; //在構造函數中創建

  同時還需要重寫屬性Items

  new public ListBoxExItemCollection Items
{
 get
 {
  return this_Items;
 }
}

  new public ListBoxExItem SelectedItem //強制轉換為ListBoxExItem
{
 get{ return baseSelectedItem as ListBoxExItem;}
 set{ baseSelectedItem = value;}
}

  new public SelectedListBoxExItemCollection SelectedItems //重新包裝SelectedItems
{
 get
 {
  return new SelectedListBoxExItemCollection(baseSelectedItems);
 }
}

  為了支持圖標添加一個圖像列表imagelist

  private ImageList imageList;

  public ImageList ImageList
{
 get { return thisimageList; }
 set
 {
  thisimageList = value;
  thisInvalidate();//圖像列表改變後馬上更新控件
 }
}

  而此控件的核心卻在一個方法OnDrawItem這個方法每當控件的項需要重繪時就被調用

  

  protected override void OnDrawItem(SystemWindowsFormsDrawItemEventArgs pe)
{
 peDrawBackground(); //畫背景
 peDrawFocusRectangle(); //畫邊框
 Rectangle bounds = peBounds;

  // Check whether the index is valid

  if(peIndex >= && peIndex < baseItemsCount)
{
 ListBoxExItem item = thisItems[peIndex]; //取得需要繪制項的引用
 int iOffset = ;

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

  if(thisimageList != null)
 {
  if (itemImageIndex > && itemImageIndex < thisimageListImagesCount)
  {
    thisimageListDraw(peGraphics boundsLeft boundsTop boundsHeight boundsHeight itemImageIndex); //繪制圖標
  }
  iOffset += boundsHeight;//thisimageListImageSizeWidth;
 }

  // Draw item text

  peGraphicsDrawString(itemText peFont new SolidBrush(itemForeColor)boundsLeft + iOffset boundsTop); //根據項的顏色繪制文本

  }
 baseOnDrawItem(pe);
 }
}

  到此為止ListBoxEx以完整的實現並且支持可視化設計


From:http://tw.wingwit.com/Article/program/net/201311/11713.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.