|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听)计划 在一个点对点文件传输的项目中,我必要显现文件传输的及时信息:传输的文件列表和以后传输的文件,事先我想到了用ListBox,可是但我用了ListBox后,我发明它不克不及改动控件中文本想的色彩,因而我就想扩大一下ListBox控件------ListBoxEx。
我的方针是给空间加上图标,还要能不时改动控件文本色彩。因而从ListBox派生类
publicclassListBoxEx:ListBox{…}
为了操纵便利我为ListBoxEx的每项计划专门的类ListBoxExItem
publicclassListBoxExItem{…}
为了坚持我这个控件与WinForm的尺度控件的操纵托言分歧,我又从头计划了两个汇合类:
publicclassListBoxExItemCollection:IList,ICollection,IEnumerator{}
//这个类相对尺度ListBox中的ObjectCollection,这个类作为ListBoxEx中的Items属性的范例
publicclassSelectedListBoxExItemCollection::IList,ICollection,IEnumerator{}
//这个类相对尺度ListBox中的SelectedObjectCollection,这个类作为ListBoxEx中的SelectedItems属性的范例
上面看两个汇合类的完成:
ListBoxExItemCollection的完成:为了做到对汇合(Items)的操纵可以实时反应到ListBoxEx的控件中以是,此类只是对ListBox中Items(ObjectCollection范例)作了一层包装,就是把ListBox中Items属性的一切办法的只需是object范例的参数都转换成ListBoxExItem,好比:
publicvoidRemove(ListBoxExItemitem)
{
this._Items.Remove(item);//_Items为ObjectCollection范例
}
publicvoidInsert(intindex,ListBoxExItemitem)
{
this._Items.Insert(index,item);
}
publicintAdd(ListBoxExItemitem)
{
returnthis._Items.Add(item);
}
由上可知,ListBoxExItemCollection中有一个机关函数来传送ListBox中的Items工具
privateObjectCollection_Items;
publicListBoxExItemCollection(ObjectCollectionbaseItems)
{
this._Items=baseItems;
}
而SelectedListBoxExItemCollection类的完成也用一样的办法,只不外是对SelectedObjectCollection包装而已。
汇合完成后,再来看ListBoxExItem的完成:
为了使它撑持图标和多种色彩增加以下成员
privateint_ImageIndex;
publicintImageIndex
{
get{returnthis._ImageIndex;}
set{this._ImageIndex=value;}
}
privateColor_ForeColor;
publicColorForeColor
{
get{returnthis._ForeColor;}
set
{
this._ForeColor=value;
this.Parent.Invalidate();
}
}
固然另有:
privatestring_Text;
publicstringText
{
get{returnthis._Text;}
set{this._Text=value;}
}
为了控件能准确显现此项的文本,还必需重写ToString()办法
publicoverridestringToString()
{
returnthis._Text;
}
再看ListBoxEx的完成:
为了使控件可以自我绘制,以是:DrawMode=DrawMode.OwnerDrawFixed;
为了掩盖基类的Items等相干属性增加
privateListBoxExItemCollection_Items;//在机关函数中创立
同时还必要重写属性Items:
newpublicListBoxExItemCollectionItems
{
get
{
returnthis._Items;
}
}
newpublicListBoxExItemSelectedItem//强迫转换为ListBoxExItem
{
get{returnbase.SelectedItemasListBoxExItem;}
set{base.SelectedItem=value;}
}
newpublicSelectedListBoxExItemCollectionSelectedItems//从头包装SelectedItems
{
get
{
returnnewSelectedListBoxExItemCollection(base.SelectedItems);
}
}
为了撑持图标,增加一个图象列表imagelist
privateImageListimageList;
publicImageListImageList
{
get{returnthis.imageList;}
set
{
this.imageList=value;
this.Invalidate();//图象列表改动后即刻更新控件
}
}
而此控件的中心却在一个办法OnDrawItem,这个办法每当控件的项必要重绘时就被挪用
protectedoverridevoidOnDrawItem(System.Windows.Forms.DrawItemEventArgspe)
{
pe.DrawBackground();//画背景
pe.DrawFocusRectangle();//画边框
Rectanglebounds=pe.Bounds;
//Checkwhethertheindexisvalid
if(pe.Index>=0&&pe.Index<base.Items.Count)
{
ListBoxExItemitem=this.Items[pe.Index];//获得必要绘制项的援用
intiOffset=0;
//Iftheimagelistispresentandtheimageindexisset,drawtheimage
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;
}
//Drawitemtext
pe.Graphics.DrawString(item.Text,pe.Font,newSolidBrush(item.ForeColor),bounds.Left+iOffset,bounds.Top);//依据项的色彩绘制文本
}
base.OnDrawItem(pe);
}
}
到此为止,ListBoxEx以完全的完成,而且撑持可视化计划。
一个很大的类库。应用程序之所以难以跨平台,在于直接调用了特定平台的接口,而一个巨大的类库,就能极大地减少应用程序对平台的依赖。 |
|