Usar o Visual C# para criar uma barra de progresso suave

Este artigo fornece informações sobre como criar um UserControl personalizado para criar um controle ProgressBar suave e de rolagem.

Versão original do produto: Visual C#
Número de KB original: 323116

Resumo

Este artigo demonstra como criar um UserControl simples e personalizado para criar um controle ProgressBar suave e de rolagem.

Em versões anteriores do controle ProgressBar, como a versão fornecida com o controle ActiveX dos Controles Comuns do Microsoft Windows, você pode exibir o progresso em duas exibições diferentes. Para controlar essas exibições, você usa a propriedade Scrolling, que inclui configurações padrão e suaves. A rolagem suave produz um bloco de cor sólido que representa o progresso, e a rolagem padrão aparece segmentada e é composta por uma série de pequenos blocos ou retângulos.

O controle ProgressBar incluído no Microsoft Visual C# dá suporte apenas à configuração padrão.

O código de exemplo neste artigo ilustra como criar um controle que dê suporte às seguintes propriedades:

  • Mínimo: essa propriedade obtém ou define o valor inferior para o intervalo de valores válidos para progresso. O valor padrão dessa propriedade é zero (0); você não pode definir essa propriedade como um valor negativo.
  • Máximo: essa propriedade obtém ou define o valor superior para o intervalo de valores válidos para progresso. O valor padrão dessa propriedade é 100.
  • Valor: essa propriedade obtém ou define o nível atual de progresso. O valor deve estar no intervalo que as propriedades Mínima e Máxima definem.
  • ProgressBarColor: essa propriedade obtém ou define a cor da barra de progresso.

Criar um controle ProgressBar personalizado

  1. Siga estas etapas para criar um novo projeto da Biblioteca de Controle do Windows no Visual C#:

    1. Inicie o Microsoft Visual Studio.

    2. No menu arquivo, aponte para novo e, em seguida, clique em Project.

    3. Na caixa de diálogo Novo Projeto, clique em Visual C# em Tipos de Projeto e clique em Windows Forms Biblioteca de Controleem Modelos.

    4. Na caixa Nome , digite SmoothProgressBar e clique em OK.

    5. No Project Explorer, renomeie o módulo de classe padrão de UserControl1.cs para SmoothProgressBar.cs.

    6. Na janela Propriedades do objeto UserControl, altere a propriedade Name de UserControl1 para SmoothProgressBar.

  2. Neste ponto, você normalmente herda da classe desse controle e, em seguida, adiciona a funcionalidade adicional para estender um controle existente. No entanto, a classe ProgressBar é selada e não pode ser herdada. Portanto, você deve criar o controle desde o início.

    Adicione o código a seguir ao arquivo SmoothProgressBar.cs , na classe derivada de 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
    
    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;
    
        // Calculate area for drawing the progress.
        rect.Width = (int)((float)rect.Width * percent);
    
        // Draw the progress meter.
        g.FillRectangle(brush, rect);
    
        // Draw a three-dimensional border around the control.
        Draw3DBorder(g);
    
        // Clean up.
        brush.Dispose();
        g.Dispose();
    }
    
    public int Minimum
    {
        get
        {
            return min;
        }
    
        set
        {
            // Prevent a negative value.
            if (value < 0)
            {
                value = 0;
            }
    
            // Make sure that the minimum value is never set higher than the maximum value.
            if (value > max)
            {
                max = 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();
        }
    }
    
    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));
    }
    
  3. No menu Compilar , clique em Criar solução para compilar o projeto.

Criar um aplicativo cliente de exemplo

  1. No menu arquivo, aponte para novo e, em seguida, clique em Project.

  2. Na caixa de diálogo Adicionar Novo Projeto, clique em Visual C# em Tipos de Projeto, clique em Windows Forms Aplicativo em Modelos e clique em OK.

  3. Siga estas etapas para adicionar duas instâncias do controle SmoothProgressBar ao formulário:

    1. No menu Ferramentas , clique em Escolher Itens da caixa de ferramentas.

    2. Clique na guia Componentes .NET Framework.

    3. Clique em Procurar e localize o arquivo SmoothProgressBar.dll , que você criou na seção Criar um controle ProgressBar personalizado .

    4. Clique em OK.

      Observação

      O controle SmoothProgressBar é adicionado à caixa de ferramentas.

    5. Arraste duas instâncias do controle SmoothProgressBar da caixa de ferramentas para a forma padrão do projeto do Aplicativo Windows.

  4. Arraste um controle Timer da caixa de ferramentas para o formulário.

  5. Adicione o seguinte código ao Tick evento do controle Timer:

    if (this.smoothProgressBar1.Value > 0)
    {
        this.smoothProgressBar1.Value--;
        this.smoothProgressBar2.Value++;
    }
    else
    {
        this.timer1.Enabled = false;
    }
    
  6. Arraste um controle button da caixa de ferramentas para o formulário.

  7. Adicione o seguinte código ao Click evento do controle Button:

    this.smoothProgressBar1.Value = 100;
    this.smoothProgressBar2.Value = 0;
    
    this.timer1.Interval = 1;
    this.timer1.Enabled = true;
    
  8. No menu Depurar , clique em Iniciar para executar o projeto de exemplo.

  9. Clique no botão .

    Observação

    Os dois indicadores de progresso exibem o progresso do texto. Um indicador de progresso exibe o progresso de maneira crescente e o outro indicador de progresso exibe o progresso de maneira decrescente ou de contagem regressiva.