Sorunsuz bir ilerleme çubuğu oluşturmak için Visual C# kullanma

Bu makalede, düzgün ve kaydırıcı bir ProgressBar denetimi oluşturmak için özel bir UserControl oluşturma hakkında bilgi sağlanır.

Orijinal ürün sürümü: Visual C#
Özgün KB numarası: 323116

Özet

Bu makalede, düzgün ve kaydırıcı bir ProgressBar denetimi oluşturmak için basit, özel bir UserControl'ün nasıl oluşturulacağı gösterilmektedir.

Microsoft Windows Ortak Denetimleri ActiveX denetimiyle sağlanan sürüm gibi ProgressBar denetiminin önceki sürümlerinde ilerleme durumunu iki farklı görünümde görüntüleyebilirsiniz. Bu görünümleri denetlemek için, standart ve düzgün ayarlar içeren Kaydırma özelliğini kullanırsınız. Düzgün kaydırma, ilerlemeyi temsil eden düz bir renk bloğu oluşturur ve standart kaydırma bölümlenmiş olarak görünür ve bir dizi küçük blok veya dikdörtgenden oluşur.

Microsoft Visual C# ile birlikte gelen ProgressBar denetimi yalnızca standart ayarı destekler.

Bu makaledeki örnek kodda aşağıdaki özellikleri destekleyen bir denetimin nasıl oluşturulacağı gösterilmektedir:

  • Minimum: Bu özellik, ilerleme için geçerli değerler aralığı için daha düşük bir değer alır veya ayarlar. Bu özelliğin varsayılan değeri sıfırdır (0); bu özelliği negatif bir değere ayarlayamazsınız.
  • Maksimum: Bu özellik, ilerleme için geçerli değerler aralığı için üst değeri alır veya ayarlar. Bu özelliğin varsayılan değeri 100'dür.
  • Değer: Bu özellik geçerli ilerleme düzeyini alır veya ayarlar. Değer, Minimum ve Maksimum özelliklerinin tanımlayacağı aralıkta olmalıdır.
  • ProgressBarColor: Bu özellik ilerleme çubuğunun rengini alır veya ayarlar.

Özel ProgressBar denetimi oluşturma

  1. Visual C# içinde yeni bir Windows Denetim Kitaplığı projesi oluşturmak için şu adımları izleyin:

    1. Microsoft Visual Studio'yu başlatın.

    2. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın.

    3. Yeni Proje iletişim kutusunda, Proje Türleri'nin altında Visual C# öğesine tıklayın ve ardından Şablonlar'ın altında Denetim Kitaplığı'nı Windows Forms tıklayın.

    4. Ad kutusuna SmoothProgressBar yazın ve Tamam'a tıklayın.

    5. Proje Gezgini'nde varsayılan sınıf modülünü UserControl1.csSmoothProgressBar.cs olarak yeniden adlandırın.

    6. UserControl nesnesinin Özellikler penceresinde Name özelliğiniUserControl1 yerine SmoothProgressBar olarak değiştirin.

  2. Bu noktada, genellikle bu denetimin sınıfından devralırsınız ve ardından mevcut bir denetimi genişletmek için ek işlevselliği eklersiniz. Ancak ProgressBar sınıfı korumalıdır ve devralınamaz. Bu nedenle, denetimi baştan oluşturmanız gerekir.

    UserControl'den türetilen sınıfına aşağıdaki kodu SmoothProgressBar.cs dosyasına ekleyin.

    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. Derleme menüsünde Çözümü Derle'ye tıklayarak projeyi derleyin.

Örnek istemci uygulaması oluşturma

  1. Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın.

  2. Yeni Proje Ekle iletişim kutusunda, Proje Türleri'nin altında Visual C# öğesine tıklayın, Şablonlar'ın altında uygulama Windows Forms ve ardından Tamam'a tıklayın.

  3. Forma SmoothProgressBar denetiminin iki örneğini eklemek için şu adımları izleyin:

    1. Araçlar menüsünde Araç Kutusu Öğelerini Seç'e tıklayın.

    2. .NET Framework Bileşenleri sekmesine tıklayın.

    3. Gözat'a tıklayın ve özel ProgressBar denetimi oluşturma bölümünde oluşturduğunuz SmoothProgressBar.dll dosyasını bulun.

    4. Tamam'ı tıklatın.

      Not

      SmoothProgressBar denetimi araç kutusuna eklenir.

    5. SmoothProgressBar denetiminin iki örneğini araç kutusundan Windows Uygulama projesinin varsayılan biçimine sürükleyin.

  4. Zamanlayıcı denetimini araç kutusundan forma sürükleyin.

  5. Zamanlayıcı denetiminin olayına Tick aşağıdaki kodu ekleyin:

    if (this.smoothProgressBar1.Value > 0)
    {
        this.smoothProgressBar1.Value--;
        this.smoothProgressBar2.Value++;
    }
    else
    {
        this.timer1.Enabled = false;
    }
    
  6. Araç kutusundan bir Düğme denetimini forma sürükleyin.

  7. Düğme denetiminin olayına Click aşağıdaki kodu ekleyin:

    this.smoothProgressBar1.Value = 100;
    this.smoothProgressBar2.Value = 0;
    
    this.timer1.Interval = 1;
    this.timer1.Enabled = true;
    
  8. Örnek projeyi çalıştırmak için Hata Ayıkla menüsünde Başlat'a tıklayın.

  9. Düğmeye tıklayın.

    Not

    İki ilerleme göstergesi metin ilerleme durumunu görüntüler. Bir ilerleme göstergesi ilerleme durumunu artan bir şekilde, diğer ilerleme göstergesi ise ilerlemeyi azalan veya geri sayım biçiminde görüntüler.