一.引子
这个控件是追求UI美化功能的产物.效果类似于VS2003的ToolBox,虽然程序的实现方法,功能与效率是软件追求的目标,不过,商业化的软件,缺乏美感总显得不那么专业.
二.设计时效果
![](https://p-blog.csdn.net/images/p_blog_csdn_net/csharp_start/JcstoolList-001.JPG)
三.运行时效果
![](https://p-blog.csdn.net/images/p_blog_csdn_net/csharp_start/JcstoolList-002.JPG)
四.谈谈主要的实现思路
应该说,这个控件的实现方法与我以前的文章JCSTOOLBOX很相似,只是在布局,以及超出部分的调整上有所不同.因为控件采用完全绘制的方法实现,所以效率很高.对于每个子项的图标采用了32X32的大小.提供了子项被选中,子项变化,单击,双击等事件.
如果哪位朋友对购买完整的源代码感兴趣,可以参看"控件源码收费表",或者发邮件给我.当然,也欢迎大家对实现方法的技术讨论.
heqiumie@tom.com
五.部分源代码
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Drawing;
using
System.Data;
using
System.Text;
using
System.Windows.Forms;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
JCSControlLibary.JcsToolList
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
[DefaultEvent("ItemDoubleClick")]
public partial class JcsToolList : UserControl
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
public JcsToolList()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
this.Padding = new Padding(0, 25 + 1, 8, 7);
_closebutton = new Rectangle(6, 4, 16, 16);
_vScrollBar = new VScrollBar();
_vScrollBar.Dock = DockStyle.Right;
this.Controls.Add(_vScrollBar);
RefreshScrollBar();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private Int32 _itemHeight = 60; //item的高
private Int32 _categoryHeight = 22;//分类项的高
private Int32 _itemBeginTop = 26;
private Int32 _itemSpace = 0;//item间隔
private const Int32 _categoryLeft = 6;//文字左侧间隔
private const Int32 _itemleft = 6;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private Rectangle _closebutton;
private VScrollBar _vScrollBar;
private JcsToolListCategoryCollection _categories = new JcsToolListCategoryCollection();
private ImageList _imagelist;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private JcsToolListCategory _selectedCateGory;
private JcsToolListItem _selectedItem = null;//选择的ITEM
private HitTestType _hittest = HitTestType.None ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
private enum HitTestType
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
CateGray,
Item,
CateGrayDown,
CateGrayUp,
Title,
None
}
public delegate void ItemChangedEventHandler(Object sender, EventArgs e);
public event ItemChangedEventHandler ItemChanged;
public event EventHandler ItemClick;
public event EventHandler ItemDoubleClick;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
Category("Jcs属性"), Description("分组项的集合")]
public JcsToolListCategoryCollection Categories
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _categories;
}
set
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_categories = value;
}
}
[Category("Jcs属性"), Description("分组项的图标集合对象")]
public ImageList ImageList
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return this._imagelist; }
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
set ...{ this._imagelist = value; }
}
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public JcsToolListCategory SelectedCateGory
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _selectedCateGory;
}
set
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (value != _selectedCateGory)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (_selectedCateGory != null)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_selectedCateGory.IsOpen = !_selectedCateGory.IsOpen;
//_selectedCateGory.IsShowButton = false;
}
_selectedCateGory = value;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_selectedCateGory = null;
}
this.Invalidate();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public JcsToolListItem SelectedItem
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return _selectedItem; }
set
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (value != _selectedItem)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_selectedItem = value;
if (ItemChanged != null)
ItemChanged(_selectedItem, new EventArgs());
this.Invalidate();
}
}
}