C#重绘,高级进度条 - (参考基础上原创)

来源:互联网 发布:windows系统描述 编辑:程序博客网 时间:2024/06/05 16:59

前年的一个项目用到了,自绘制进度条,网上都是VB的例子,也参考了下,改成了C#的例子,放在这里,备以后查用。

----------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace AdvancedProgressBar
{
    public partial class AdvancedProgressBar : UserControl
    {
        int min = 0; //Minimum value for progress range    
        int max = 100; //Maximum value for progress range    
        int val = 0; //Current progress    
        Color BarColor = Color.Blue; //Color of progress meter    
        string content = "Contents here";
        int blockWidth = 36;
        int intervalWidth = 4;

        public int Minimum
        {
             get { return min; }

            set
            {
                //Prevent a negative value.    
                if (value < 0)
                {
                     min = 0;
                }

                //Make sure that the minimum value is never set higher than the maximum value.    

                if (value > max)
                {
                     min = value;
                     min = value;
                }

                //Ensure value is still in range    
                if (val < min)
                 {
                     val = min;
                }

                //Invalidate the control to get a repaint.    
                this.Invalidate();
            }
        }

        public int Maximum
        {
             get { return max; }

            set
            {
                //Make sure that the maximum value is never set lower than the minimum value.    
                if (value < min)
                {
                     min = value;
                }

                max = value;

                //Make sure that value is still in range.    
                if (val > max)

                {
                     val = max;
                }

                //Invalidate the control to get a repaint.    
                this.Invalidate();
            }
        }

        public int Value
        {
             get { return val; }

            set
            {
                int oldValue = val;

                //Make sure that the value does not stray outside the valid range.   
                if (value < min)
                {
                     val = min;
                }
                 else if (value > max)
                {
                     val = max;
                }
                 else
                {
                     val = value;
                }

                //Invalidate only the changed area.    
                float percent;


                Rectangle newValueRect = this.ClientRectangle;
                Rectangle oldValueRect = this.ClientRectangle;

                //Use a new value to calculate the rectangle for progress.    
                percent = (float)(val - min) / (float)(max - min);
                newValueRect.Width = (int)((float)newValueRect.Width * percent);

                //Use an old value to calculate the rectangle for progress.    
                percent = (float)(oldValue - min) / (float)(max - min);
                 oldValueRect.Width = (int)((float)oldValueRect.Width * percent);

                Rectangle updateRect = new Rectangle();

                //Find only the part of the screen that must be updated.    
                if (newValueRect.Width > oldValueRect.Width)
                {
                     updateRect.X = oldValueRect.Size.Width;
                     updateRect.Width = newValueRect.Width - oldValueRect.Width;
                }
                 else
                {
                     updateRect.X = newValueRect.Size.Width;
                     updateRect.Width = oldValueRect.Width - newValueRect.Width;
                }

                updateRect.Height = this.Height;

                //Invalidate the intersection region only.    
                this.Invalidate(updateRect);
            }
        }

        public Color ProgressBarColor
        {
             get { return BarColor; }

            set
            {
                BarColor = value;

                //Invalidate the control to get a repaint.    
                this.Invalidate();
            }
        }

        public string ContentText
        {
             get { return content; }
            set
            {
                content = value;
                this.Refresh();
            }
        }

        public int BlockWidth
        {
             get { return blockWidth; }
            set
            {
                if (value >= 0)
                {
                     blockWidth = value;
                }
                 else

                {
                     blockWidth = 0;
                }

                if (value <= max - min)
                {
                     blockWidth = value;
                }
                 else
                {
                     blockWidth = max - min;
                }
                this.Refresh();
            }
        }

        public int IntervalWidth
        {
             get { return intervalWidth; }
            set
            {
                if (value >= 0)
                {
                     intervalWidth = value;
                }
                 else
                {
                     intervalWidth = 0;
                }

                if (value <= max - min)
                {
                     intervalWidth = value;

                }
                 else
                {
                     intervalWidth = max - min;
                }
                this.Refresh();
            }
        }

        public AdvancedProgressBar()
        {
            InitializeComponent();
        }

        protected override void OnResize(EventArgs e)
        {
            //Invalidate the control to get a repaint.    
            this.Invalidate();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            SolidBrush brush = new SolidBrush(BarColor);
            float percent = (float)(val - min) / (float)(max - min);
            Rectangle rect = this.ClientRectangle;
            Rectangle rectFilled = new Rectangle();
            Rectangle rectNotFilled = new Rectangle();
            rectFilled.Height = rect.Height;
            rectNotFilled.Height = rect.Height;
            rectFilled.Y = rect.Y;
            rectNotFilled.Y = rect.Y;
            rectFilled.Width = blockWidth;

            rectNotFilled.Width = intervalWidth;
            int x = rect.X;

            //Calculate area for drawing the progress.    
            rect.Width = (int)((float)rect.Width * percent);

            //Draw the progress meter.    
            //g.FillRectangle(brush, rect);

             while (true)
            {
                rectFilled.X = x;


                if (x + rectFilled.Width < rect.Width)
                {
                     g.FillRectangle(brush, rectFilled);
                }
                 else
                {
                    rectFilled.Width = rect.Width - x;
                     g.FillRectangle(brush, rectFilled);
                     break;
                }

                 x += rectFilled.Width;
                rectNotFilled.X = x;

                if (x + rectNotFilled.Width < rect.Width)
                {
                     g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
                }
                 else

                {
                    rectNotFilled.Width = rect.Width - x;
                     g.FillRectangle((Brush)(new SolidBrush(Color.Empty)), rectNotFilled);
                     break;
                }

                 x += rectNotFilled.Width;
            }

            //Draw a three-dimensional border around the control.    
            Draw3DBorder(g);

            //Draw [ xx mins left ]
            DrawText(content);

            //Clean up.   
             brush.Dispose();
             g.Dispose();
        }

        private void Draw3DBorder(Graphics g)
        {
            int PenWidth = (int)Pens.White.Width;

             g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),
             new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));
             g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top), new Point(this.ClientRectangle.Left,
this.ClientRectangle.Height - PenWidth));
             g.DrawLine(Pens.White, new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth),
             new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
             g.DrawLine(Pens.White, new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top),
             new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));
        }


        private void DrawText(string content)
        {
            int leftWidth = (int)((float)this.ClientRectangle.Width * (((float)max - (float)val) / ((float)max - (float)min)));


            ContentLabel.Text = content;

            int middleY = this.ClientRectangle.Height / 2 - ContentLabel.Height / 2;

            if (ContentLabel.Width < leftWidth)
            {
                ContentLabel.ForeColor = Color.Black;
                int middleX = this.ClientRectangle.Width / 2 - ContentLabel.Width / 2 + (this.ClientRectangle.Width - leftWidth) / 2;
                ContentLabel.Location = new Point(middleX, middleY);
            }
             else
            {
                ContentLabel.ForeColor = Color.White;
                int middleX = (this.ClientRectangle.Width - leftWidth) / 2 - ContentLabel.Width / 2;
                ContentLabel.Location = new Point(middleX, middleY);
            }
        }
    }
}

原创粉丝点击