Como criar uma barra de progresso suave no Visual C#

Traduções de Artigos Traduções de Artigos
Artigo: 323116 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 323088.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo demonstra como criar uma simples, personalizado UserControl para criar um uniforme, ProgressBar controlo de deslocamento.

Em versões anteriores do controlo de ProgressBar , tal como a versão que é fornecido com o controlo ActiveX de controlos comuns do Microsoft Windows, pode ver o progresso em duas vistas diferentes. Para controlar estas vistas, utilize a propriedade de deslocamento , que inclui as definições padrão e suaves. Deslocação de ecrã uniforme produz um bloco sólido de cores que representa o progresso e deslocamento padrão aparece segmentada e é constituído por uma série de pequenos blocos ou rectângulos.

O controlo de ProgressBar incluído com o Microsoft Visual C# suporta apenas a definição padrão.

O código de exemplo neste artigo ilustra como criar um controlo que suporta as seguintes propriedades:
  • mínimo . Esta propriedade obtém ou define o valor inferior para o intervalo de valores válidos para o curso. O valor predefinido desta propriedade é zero (0); não é possível definir esta propriedade para um valor negativo.
  • máximo . Esta propriedade obtém ou define o valor superior para o intervalo de valores válidos para o curso. O valor predefinido desta propriedade é 100.
  • valor . Esta propriedade obtém ou define o nível actual de progresso. O valor deve estar no intervalo que definem o mínimo e máximo propriedades.
  • ProgressBarColor . Esta propriedade obtém ou define a cor da barra de progresso.

Criar um controlo de ProgressBar personalizado

  1. Siga estes passos para criar um novo projecto de biblioteca de controlo do Windows no Visual C#:
    1. Inicie o Microsoft Visual Studio.
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Na caixa de diálogo Novo projecto , clique em Visual C# em Project Types e, em seguida, clique em Biblioteca de controlos formulários do Windows em modelos .

      Nota No Visual Studio .NET 2003, clique em Visual C# Projects em vez do Visual C# .
    4. Na caixa nome , escreva SmoothProgressBar e, em seguida, clique em OK .
    5. No Explorador de projecto, mude o nome o módulo de classe predefinido de UserControl1.cs para SmoothProgressBar.cs.
    6. Na janela Propriedades para o objecto UserControl , altere a propriedade Name do UserControl1 para SmoothProgressBar .
  2. Neste ponto, normalmente herda da classe de que o controlo e adicione a funcionalidade adicional para expandir um controlo existente. No entanto, a classe de ProgressBar está selado e não pode ser herdada. Por conseguinte, terá de criar o controlo a partir do início.

    Adicione o seguinte código ao ficheiro SmoothProgressBar.cs, na classe que deriva UserControl.

    Nota No Visual Studio .NET 2003, adicione o código do módulo de classe da classe UserControl derivada, apenas depois da secção ? o criador de formulários Windows gerado código ?.
    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)
    		{
    			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();
    	}
    }
    
    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 criar , clique em Criar soluções para compilar o projecto.

Criar uma aplicação de cliente exemplo

  1. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  2. Na caixa de diálogo Adicionar novo projecto , clique em Visual C# em Project Types , clique em Aplicações de formulários do Windows em modelos e, em seguida, clique em OK .

    Nota No Visual Studio .NET 2003, clique em Visual C# Projects em vez do Visual C# .
  3. Siga estes passos para adicionar duas instâncias do controlo SmoothProgressBar ao formulário:
    1. No menu Ferramentas , clique em Seleccionar itens de caixa de ferramentas .

      Nota No Visual Studio .NET 2003, clique em Personalizar a caixa de ferramentas em vez de Seleccionar itens de caixa de ferramentas .
    2. Clique no separador de .NET Framework Components .
    3. Clique em Procurar e, em seguida, localize o ficheiro SmoothProgressBar.dll que criou na secção "Create a custom ProgressBar control".
    4. Clique em OK . Repare que o controlo SmoothProgressBar é adicionado à caixa de ferramentas.
    5. Arraste duas instâncias do controlo SmoothProgressBar da caixa de ferramentas para o formulário predefinido do projecto Windows Application.
  4. Arraste um controlo de temporizador da caixa de ferramentas para o formulário.
  5. Adicione o seguinte código ao evento das marcas de escala do temporizador de controlo:
    if (this.smoothProgressBar1.Value > 0)
    {
    	this.smoothProgressBar1.Value--;
    	this.smoothProgressBar2.Value++;
    }
    else
    {
    	this.timer1.Enabled = false;
    } 
    					
  6. Arraste um controlo de botão da caixa de ferramentas para o formulário.
  7. Adicione o seguinte código ao evento Click do botão de controlo:
    this.smoothProgressBar1.Value = 100;
    this.smoothProgressBar2.Value = 0;
    			
    this.timer1.Interval = 1;
    this.timer1.Enabled = true; 
    					
  8. No menu Debug , clique em Iniciar para executar o projecto de exemplo.
  9. Clique no botão. Repare que os indicadores de dois progresso apresentam o texto "curso". Um indicador de progresso mostra o progresso de forma crescente e o indicador de progresso mostra o progresso num diminuir ou uma forma de contagem decrescente.

Propriedades

Artigo: 323116 - Última revisão: 1 de agosto de 2008 - Revisão: 4.1
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbhowtomaster KB323116 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 323116

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com