仿 flashget 的多任务进度条控件

今天忽然想起很久以前简单的模仿了一个, 呵呵(第一次 看到 Flashget 的多任务进度条工具时, 很是欣赏)

先放一个效果图

从图上可以看到有两个任务在运行, 各图示的解释:

灰色:还没开始执行的 cell

红色:正在执行的 cell

绿色:执行成功的 cell

黄色:执行出错的 cell

 控件使用很简单, 大家看看注释应该就明白了

        /// <summary>
        
/// 普通项目的颜色
        
/// </summary>
        [Description("普通项目的颜色"), DefaultValue(typeof(Color), "Gray")]
        
public Color NormalColor
        
        
/// <summary>
        
/// 进行中的项目颜色
        
/// </summary>
        [Description("进行中的项目颜色"), DefaultValue(typeof(Color), "Red")]
        
public Color ProcessingColor

        
/// <summary>
        
/// 成功项目的颜色
        
/// </summary>
        [Description("已成功完成项目的颜色"), DefaultValue(typeof(Color), "Green")]
        
public Color CompleteColor

        
/// <summary>
        
/// 错误项目的颜色
        
/// </summary>
        [Description("错误项目的颜色"), DefaultValue(typeof(Color), "Yellow")]
        
public Color ErrorColor

        
/// <summary>
        
/// 每一个任务包含的块数
        
/// </summary>
        [Browsable(false)]
        
public List<int> Tasks

        
// 方法就一个
        
/// <summary>
        
/// 设置 Cell 的状态
        
/// </summary>
        
/// <param name="task">任务索引</param>
        
/// <param name="block">任务的块索引</param>
        
/// <param name="state">状态</param>
        public void SetBlockState(int task, int block, TaskState state)

再贴一段测试代码(执行后就是上图中中的效果):



        
private void button1_Click(object sender, EventArgs e)
        {
            
//开启两个线程, 模仿两个任务
            new Thread(ThreadRun1).Start();
            
new Thread(ThreadRun2).Start();
        }

        
//第一个任务
        int thread1Index;

        
/// <summary>
        
/// 任务开始
        
/// </summary>
        void Thread1Start()
        {
            MultiProgress.SetBlockState(
0, thread1Index, HW.Windows.Forms.TaskState.PROCESSING);
        }
        
/// <summary>
        
/// 任务完成
        
/// </summary>
        void Thread1Complete()
        {
            
if (thread1Index % 4 == 0)
                MultiProgress.SetBlockState(
0, thread1Index++, HW.Windows.Forms.TaskState.ERROR);
            
else
                MultiProgress.SetBlockState(
0, thread1Index++, HW.Windows.Forms.TaskState.COMPLETE);
        }
        
void ThreadRun1()
        {
            
for (int i = 0; i < MultiProgress.Tasks[0]; i++)
            {
                Invoke(
new MethodInvoker(Thread1Start));
                
//处理耗时的操作
                
//
                Thread.Sleep(300);
                
//设置状态
                Invoke(new MethodInvoker(Thread1Complete));
            }
        }

        
//第二个任务, 代码和第一个一样。。。
        int thread2Index;
        
void Thread2Start()
        {
            MultiProgress.SetBlockState(
1, thread2Index, HW.Windows.Forms.TaskState.PROCESSING);
        }

        
void Thread2Complete()
        {
            
if (thread2Index % 4 == 0)
                MultiProgress.SetBlockState(
1, thread2Index++, HW.Windows.Forms.TaskState.ERROR);
            
else
                MultiProgress.SetBlockState(
1, thread2Index++, HW.Windows.Forms.TaskState.COMPLETE);
        }

        
void ThreadRun2()
        {
            
for (int i = 0; i < MultiProgress.Tasks[1]; i++)
            {
                Invoke(
new MethodInvoker(Thread2Start));
                
//处理耗时的操作
                
//
                Thread.Sleep(200);
                
//设置状态
                Invoke(new MethodInvoker(Thread2Complete));
            }
        }

        
/// <summary>
        
/// 设置两个任务, 第一个有30个块, 第二个有50个块
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            MultiProgress.Tasks 
= new List<int>(new int[] { 3050 });

        }


 控件下载

原文地址:https://www.cnblogs.com/michaelhuwei/p/1257282.html