UI系列--JcsToolList控件(类似VS2003的ToolBox)

一.引子

   这个控件是追求UI美化功能的产物.效果类似于VS2003的ToolBox,虽然程序的实现方法,功能与效率是软件追求的目标,不过,商业化的软件,缺乏美感总显得不那么专业.

二.设计时效果

三.运行时效果

四.谈谈主要的实现思路

  应该说,这个控件的实现方法与我以前的文章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;

namespace  JCSControlLibary.JcsToolList
{
    [DefaultEvent(
"ItemDoubleClick")]
    
public partial class JcsToolList : UserControl
    
{
        
public JcsToolList()
        
{
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint, 
true);
            SetStyle(ControlStyles.DoubleBuffer, 
true);
            SetStyle(ControlStyles.UserPaint, 
true);
            SetStyle(ControlStyles.ResizeRedraw, 
true);
            
this.Padding = new Padding(025 + 187);
            _closebutton 
= new Rectangle(641616);
            _vScrollBar 
= new VScrollBar();
            _vScrollBar.Dock 
= DockStyle.Right;
            
this.Controls.Add(_vScrollBar);
            RefreshScrollBar();
        }


        
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;

        
private Rectangle _closebutton;
        
private VScrollBar _vScrollBar;
        
private JcsToolListCategoryCollection _categories = new JcsToolListCategoryCollection();
        
private ImageList _imagelist;

        
private JcsToolListCategory _selectedCateGory;
        
private JcsToolListItem _selectedItem = null;//选择的ITEM
        private HitTestType _hittest = HitTestType.None ;

        
private enum HitTestType
        
{
            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;


        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        Category(
"Jcs属性"), Description("分组项的集合")]
        
public JcsToolListCategoryCollection Categories
        
{
            
get
            
{
                
return _categories;
            }

            
set
            
{
                _categories 
= value;
            }

        }

        [Category(
"Jcs属性"), Description("分组项的图标集合对象")]
        
public ImageList ImageList
        
{
            
get return this._imagelist; }
            
set this._imagelist = value; }
        }

        [Browsable(
false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        
public JcsToolListCategory SelectedCateGory
        
{
            
get
            
{
                
return _selectedCateGory;
            }

            
set
            
{
                
if (value != _selectedCateGory)
                
{
                    
if (_selectedCateGory != null)
                    
{
                        _selectedCateGory.IsOpen 
= !_selectedCateGory.IsOpen;
                        
//_selectedCateGory.IsShowButton = false;
                    }

                    _selectedCateGory 
= value;
                }

                
else
                
{
                    _selectedCateGory 
= null;
                }

                
this.Invalidate();
            }

        }


        
public JcsToolListItem SelectedItem
        
{
            
get return _selectedItem; }
            
set
            
{
                
if (value != _selectedItem)
                
{
                    _selectedItem 
= value;
                    
if (ItemChanged != null)
                        ItemChanged(_selectedItem, 
new EventArgs());
                    
this.Invalidate();
                }

            }

        }

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS风格的ToolBox和QQ的界面很相似,都是有多个栏目,并且这些栏目可以展开和折叠,当鼠标在某个子栏目上时,可以高亮显示,另外在VS风格的ToolBox中,点击选中项目的时候,要用特殊的颜色标识出来。 1. 创建件的边框,我在前边的文章也讲过(),直接将代码复制过来,稍做修改即可。 2. 添加滚动条,因为我们的件只需要垂直的滚动,所以我只只加入一个垂直的滚动条。 3. ToolBox包含多个Category,我们不但要创建Category类,还要创建这个类的集合。 4. 每一个Category包含多个Item,我们不但要创建ToolBoxItem类,还要创建这个类的集合。 5. 重载OnPaint方法,绘制件的内容,在绘制的时候要注意滚动条的当前值,由于采用了双缓冲机制,所以每次总是将所有的内容重绘一次,不考虑ClipRect。 6. 写一个方法,根据鼠标的坐标计算出鼠标指向的Item或者Category,这个方法是这个件的核心。 7. 重载OnMouseMove方法,当鼠标指向某个Item的时候,高亮显示出来。 8. 重载 OnMouseDown方法,当鼠标在某个Item上按下的时候,用指定的颜色标识出来,如果鼠标按下的地方是一个Category,根据当前的情况展开或者时折叠这个category。 9. 计算件当前状态的内容的总的高度,用于设置滚动条的可见与不可见。 10. 暴露一个属性,用于为用户提供当前选中的Item。 11. 声明一个ItemChanged事件,便于用户在选择另一个Item时添加处理的代码。 实现了上述的内容,这个件也就基本完成了。由于代码并不复杂,我就不将代码列出来讲解了,我将提供代码的下载,大家在看代码的时候,如有不明白的地方,可以参考我前面的件教程。因为只花了几个小时写的这个件,难免还有一些问题,请大家指出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值