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
Siga estas etapas para criar um novo projeto da Biblioteca de Controle do Windows no Visual C#:
Inicie o Microsoft Visual Studio.
No menu arquivo, aponte para novo e, em seguida, clique em Project.
Na caixa de diálogo Novo Projeto, clique em Visual C# em Tipos de Projeto e clique em Windows Forms Biblioteca de Controleem Modelos.
Na caixa Nome , digite SmoothProgressBar e clique em OK.
No Project Explorer, renomeie o módulo de classe padrão de UserControl1.cs para SmoothProgressBar.cs.
Na janela Propriedades do objeto UserControl, altere a propriedade Name de UserControl1 para SmoothProgressBar.
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)); }
No menu Compilar , clique em Criar solução para compilar o projeto.
Criar um aplicativo cliente de exemplo
No menu arquivo, aponte para novo e, em seguida, clique em Project.
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.
Siga estas etapas para adicionar duas instâncias do controle SmoothProgressBar ao formulário:
No menu Ferramentas , clique em Escolher Itens da caixa de ferramentas.
Clique na guia Componentes .NET Framework.
Clique em Procurar e localize o arquivo SmoothProgressBar.dll , que você criou na seção Criar um controle ProgressBar personalizado .
Clique em OK.
Observação
O controle SmoothProgressBar é adicionado à caixa de ferramentas.
Arraste duas instâncias do controle SmoothProgressBar da caixa de ferramentas para a forma padrão do projeto do Aplicativo Windows.
Arraste um controle Timer da caixa de ferramentas para o formulário.
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; }
Arraste um controle button da caixa de ferramentas para o formulário.
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;
No menu Depurar , clique em Iniciar para executar o projeto de exemplo.
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.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de