Πώς μπορείτε να δημιουργήσετε μια γραμμή προόδου ομαλή στο Visual C#

Για την Microsoft Visual Basic .NET έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα 323088 .

Σύνοψη

Αυτό το άρθρο παρουσιάζει τον τρόπο για να δημιουργήσετε μια απλή, προσαρμοσμένη UserControl για να δημιουργήσετε ένα απαλό κύλισης ProgressBar στοιχείο ελέγχου.

Σε παλαιότερες εκδόσεις του στοιχείου ελέγχου ProgressBar , όπως την έκδοση που παρέχεται με το στοιχείο ελέγχου Microsoft Windows κοινά στοιχεία ελέγχου ActiveX, μπορείτε να προβάλετε την πρόοδο σε δύο διαφορετικές προβολές. Για να ελέγξετε αυτές τις προβολές, μπορείτε να χρησιμοποιήσετε την ιδιότητα κύλιση , το οποίο περιλαμβάνει τις ρυθμίσεις Βασική και ομαλές. Ομαλή κύλιση παράγει ένα συμπαγές μπλοκ χρώματος που αντιπροσωπεύει την πρόοδο και τυπική κύλισης εμφανίζεται τμηματική και αποτελείται από μια σειρά μικρών μπλοκ ή ορθογώνια.

Το στοιχείο ελέγχου ProgressBar που περιλαμβάνεται με Microsoft Visual C# υποστηρίζει μόνο τη βασική ρύθμιση.

Το δείγμα κώδικα σε αυτό το άρθρο παρουσιάζει τον τρόπο για να δημιουργήσετε ένα στοιχείο ελέγχου που υποστηρίζει τις ακόλουθες ιδιότητες:

  • Ελάχιστο. Αυτή η ιδιότητα λαμβάνει ή ορίζει την χαμηλότερη τιμή για την περιοχή των έγκυρων τιμών για την πρόοδο. Η προεπιλεγμένη τιμή αυτής της ιδιότητας είναι μηδέν (0). Δεν μπορείτε να ορίσετε αυτήν την ιδιότητα σε μια αρνητική τιμή.
  • Μέγιστο. Αυτή η ιδιότητα λαμβάνει ή ορίζει στην ανώτερη τιμή για την περιοχή των έγκυρων τιμών για την πρόοδο. Η προεπιλεγμένη τιμή αυτής της ιδιότητας είναι 100.
  • Τιμή. Αυτή η ιδιότητα λαμβάνει ή ορίζει το τρέχον επίπεδο της προόδου. Η τιμή πρέπει να είναι στην περιοχή που καθορίζουν το ελάχιστο και το μέγιστο ιδιότητες.
  • ProgressBarColor. Αυτή η ιδιότητα λαμβάνει ή ορίζει το χρώμα της γραμμής προόδου.

Δημιουργία ενός προσαρμοσμένου στοιχείου ελέγχου ProgressBar

  1. Ακολουθήστε τα παρακάτω βήματα για να δημιουργήσετε ένα νέο έργο βιβλιοθήκη στοιχείων ελέγχου των Windows στο Visual C#:
    1. Ξεκινήστε το Microsoft Visual Studio.
    2. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο.
    3. Στο πλαίσιο διαλόγου " Νέο έργο ", κάντε κλικ στο κουμπί Visual C# στην περιοχή Τύπους έργωνκαι, στη συνέχεια, κάντε κλικ στο κουμπί Βιβλιοθήκη στοιχείων ελέγχου φορμών των Windows στην περιοχή πρότυπα.

      Σημείωση Στο Visual Studio .NET 2003, κάντε κλικ στο κουμπί Visual C# έργα αντί για Visual C#.
    4. Στο πλαίσιο όνομα , πληκτρολογήστε SmoothProgressBarκαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.
    5. Στην Εξερεύνηση έργου, μετονομάστε την προεπιλεγμένη λειτουργική μονάδα κλάσης από UserControl1.cs σε SmoothProgressBar.cs.
    6. Στο παράθυρο "Ιδιότητες" για το αντικείμενο UserControl , αλλάξτε την ιδιότητα όνομα από UserControl1 σε SmoothProgressBar.
  2. Σε αυτό το σημείο, συνήθως γίνεται μεταβίβαση από την κλάση αυτού του στοιχείου ελέγχου και στη συνέχεια να προσθέσετε πρόσθετη λειτουργικότητα για να επεκτείνετε ένα υπάρχον στοιχείο ελέγχου. Ωστόσο, το ProgressBar κλάση είναι σφραγισμένα και δεν είναι δυνατό να μεταβιβαστεί. Επομένως, πρέπει να δημιουργήσετε το στοιχείο ελέγχου από την αρχή.

    Προσθέστε τον ακόλουθο κώδικα στο αρχείο SmoothProgressBar.cs, στην κλάση που προκύπτει από UserControl.

    Σημείωση Στο Visual Studio .NET 2003, προσθέστε τον κώδικα στη λειτουργική μονάδα κλάσης της κλάσης UserControl που προέρχονται, αμέσως μετά την ενότητα "Windows σχεδιαστής φόρμας δημιούργησε κώδικα".
    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. Από το μενού Δημιουργία , κάντε κλικ στο κουμπί Δημιουργία λύσης για να μεταγλωττίσετε το έργο.

Δημιουργία δείγματος εφαρμογής προγράμματος-πελάτη

  1. Στο μενού αρχείο , επιλέξτε Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο.
  2. Στο πλαίσιο διαλόγου " Προσθήκη νέου έργου ", κάντε κλικ στο κουμπί Visual C# στην περιοχή Τύπους έργων, κάντε κλικ στο κουμπί Εφαρμογή φόρμες των Windows στην περιοχή πρότυπακαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.

    Σημείωση Στο Visual Studio .NET 2003, κάντε κλικ στο κουμπί Visual C# έργα αντί για Visual C#.
  3. Ακολουθήστε τα παρακάτω βήματα για να προσθέσετε δύο παρουσίες του SmoothProgressBar ελέγχου στη φόρμα:
    1. Στο μενού Εργαλεία , κάντε κλικ στο κουμπί Επιλέξτε τα στοιχεία της εργαλειοθήκης.

      Σημείωση Στο Visual Studio .NET 2003, κάντε κλικ στο κουμπί Προσαρμογή εργαλειοθήκη αντί να Επιλέξετε τα στοιχεία της εργαλειοθήκης.
    2. Κάντε κλικ στην καρτέλα Στοιχεία του .NET Framework .
    3. Κάντε κλικ στο κουμπί Αναζήτησηκαι στη συνέχεια εντοπίστε το αρχείο SmoothProgressBar.dll που δημιουργήσατε στην ενότητα "Δημιουργία ενός προσαρμοσμένου στοιχείου ελέγχου ProgressBar".
    4. Κάντε κλικ στο κουμπί OK. Παρατηρήστε ότι το στοιχείο ελέγχου SmoothProgressBar προστίθεται στην εργαλειοθήκη.
    5. Σύρετε δύο παρουσίες του SmoothProgressBar ελέγχου από την εργαλειοθήκη την προεπιλεγμένη φόρμα του έργου εφαρμογής των Windows.
  4. Σύρετε ένα στοιχείο ελέγχου του χρονιστή από την εργαλειοθήκη στη φόρμα.
  5. Προσθέστε τον ακόλουθο κώδικα στο συμβάν υποδιαίρεσης του στοιχείου ελέγχου του χρονιστή :
    if (this.smoothProgressBar1.Value > 0){
    this.smoothProgressBar1.Value--;
    this.smoothProgressBar2.Value++;
    }
    else
    {
    this.timer1.Enabled = false;
    }

  6. Σύρετε ένα στοιχείο ελέγχου κουμπιού από την εργαλειοθήκη στη φόρμα.
  7. Προσθέστε τον ακόλουθο κώδικα στο συμβάν κάντε κλικ στο κουμπί του στοιχείου ελέγχου κουμπιού :
    this.smoothProgressBar1.Value = 100;this.smoothProgressBar2.Value = 0;

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

  8. Από το μενού Εντοπισμός σφαλμάτων , κάντε κλικ στην επιλογή Έναρξη για να εκτελέσετε το δείγμα έργου.
  9. Κάντε κλικ στο κουμπί. Παρατηρήστε ότι οι δύο προόδου δείκτες εμφανίζει το κείμενο "σε εξέλιξη". Μία ένδειξη προόδου εμφανίζει την πρόοδο με αυξανόμενη τρόπο και η άλλη ένδειξη προόδου εμφανίζει την πρόοδο σε μια μείωση ή τρόπο αντίστροφης μέτρησης.
Ιδιότητες

Αναγνωριστικό άρθρου: 323116 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια