Come creare una barra di avanzamento senza problemi in Visual C#

Per una versione di Microsoft Visual Basic .NET di questo articolo, vedere 323088 .

Riepilogo

In questo articolo viene illustrato come creare un semplice e personalizzato UserControl per creare un, lo scorrimento continuo controllo ProgressBar .

Nelle versioni precedenti del controllo ProgressBar , ad esempio la versione fornita con il controllo ActiveX controlli comuni di Microsoft Windows, è possibile visualizzare lo stato di avanzamento in due diverse visualizzazioni. Per controllare queste visualizzazioni, utilizzare la proprietà di scorrimento , che include le impostazioni standard e uniforme. Scorrimento continuo produce un blocco omogeneo di colore che rappresenta lo stato di avanzamento e lo scorrimento standard appare segmentato ed è costituito da una serie di piccoli blocchi o rettangoli.

Il controllo ProgressBar è incluso con Microsoft Visual C# supporta solo l'impostazione standard.

Il codice di esempio in questo articolo viene illustrato come creare un controllo che supporta le seguenti proprietà:

  • Valore minimo. Questa proprietà ottiene o imposta il valore più basso per l'intervallo di valori validi per stato di avanzamento. Il valore predefinito di questa proprietà è zero (0). è possibile impostare questa proprietà su un valore negativo.
  • Massimo. Questa proprietà ottiene o imposta un valore superiore dell'intervallo di valori validi per stato di avanzamento. Il valore predefinito di questa proprietà è 100.
  • Valore. Questa proprietà ottiene o imposta il livello corrente dello stato di avanzamento. Il valore deve essere compreso nell'intervallo che definiscono le proprietà di massimo e minimo .
  • ProgressBarColor. Questa proprietà ottiene o imposta il colore dell'indicatore.

Creare un controllo ProgressBar

  1. Seguire questi passaggi per creare un nuovo progetto libreria di controlli Windows in Visual C#:
    1. Avviare Microsoft Visual Studio.
    2. Dal menu File , scegliere Nuovo, quindi progetto.
    3. Nella finestra di dialogo Nuovo progetto , fare clic su Visual C# in Tipi progettoe quindi fare clic su Libreria di controlli Windows Form nel riquadro modelli.

      Nota: In Visual Studio .NET 2003, fare clic su Progetti di Visual C# , invece di Visual C#.
    4. Nella casella nome digitare SmoothProgressBare quindi fare clic su OK.
    5. In Esplora progetti, rinominare il modulo di classe predefinito da UserControl1. cs in SmoothProgressBar.cs.
    6. Nella finestra proprietà per l'oggetto UserControl , modificare la proprietà Name da UserControl1 a SmoothProgressBar.
  2. A questo punto, in genere eredita dalla classe del controllo e quindi aggiungere la funzionalità aggiuntiva per estendere un controllo esistente. Tuttavia, la classe ProgressBar è sealed e non può essere ereditata. Pertanto, è necessario compilare il controllo dall'inizio.

    Aggiungere il codice seguente al file SmoothProgressBar.cs, nella classe che deriva da UserControl.

    Nota: In Visual Studio .NET 2003, aggiungere il codice al modulo di classe della classe UserControl derivato, subito dopo la sezione "Codice generato da Progettazione Windows Form".
    int min = 0;// Minimum value for progress rangeint 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. Scegliere Genera soluzione per compilare il progetto dal menu Compila .

Creare un'applicazione client di esempio

  1. Dal menu File , scegliere Nuovo, quindi progetto.
  2. Nella finestra di dialogo Aggiungi nuovo progetto , fare clic su Visual C# in Tipi progetto, fare clic su Applicazione Windows Form in modellie quindi fare clic su OK.

    Nota: In Visual Studio .NET 2003, fare clic su Progetti di Visual C# , invece di Visual C#.
  3. Attenersi alla procedura seguente per aggiungere due istanze del controllo SmoothProgressBar al modulo:
    1. Dal menu Strumenti , fare clic su Scegli elementi della casella degli strumenti.

      Nota: In Visual Studio .NET 2003, scegliere Personalizza casella degli strumenti anziché Scegli elementi della casella degli strumenti.
    2. Fare clic sulla scheda Componenti.NET Framework .
    3. Fare clic su Sfogliae individuare il file SmoothProgressBar.dll, che è stato creato nella sezione "creare un controllo ProgressBar personalizzato".
    4. Fare clic su OK. Si noti che il controllo SmoothProgressBar viene aggiunto alla casella degli strumenti.
    5. Trascinare due istanze del controllo SmoothProgressBar dalla casella degli strumenti al form predefinito del progetto applicazione Windows.
  4. Trascinare un controllo Timer dalla casella degli strumenti al form.
  5. Aggiungere il codice seguente all'evento Tick del Timer di controllo:
    if (this.smoothProgressBar1.Value > 0){
    this.smoothProgressBar1.Value--;
    this.smoothProgressBar2.Value++;
    }
    else
    {
    this.timer1.Enabled = false;
    }

  6. Trascinare un controllo pulsante dalla casella degli strumenti al form.
  7. Aggiungere il seguente codice all'evento Click del controllo Button :
    this.smoothProgressBar1.Value = 100;this.smoothProgressBar2.Value = 0;

    this.timer1.Interval = 1;
    this.timer1.Enabled = true;

  8. Dal menu Debug , fare clic su Start per eseguire il progetto di esempio.
  9. Fare clic sul pulsante. Si noti che gli indicatori di due avanzamento visualizzano il testo "corso". Un indicatore di stato Visualizza lo stato di avanzamento in modo crescente e l'indicatore di stato Visualizza lo stato di avanzamento in una riduzione o modo conto alla rovescia.
Proprietà

ID articolo: 323116 - Ultima revisione: 30 gen 2017 - Revisione: 1

Feedback