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
Visual C# içinde yeni bir Windows Denetim Kitaplığı projesi oluşturmak için şu adımları izleyin:
Microsoft Visual Studio'yu başlatın.
Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın.
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.
Ad kutusuna SmoothProgressBar yazın ve Tamam'a tıklayın.
Proje Gezgini'nde varsayılan sınıf modülünü UserControl1.csSmoothProgressBar.cs olarak yeniden adlandırın.
UserControl nesnesinin Özellikler penceresinde Name özelliğiniUserControl1 yerine SmoothProgressBar olarak değiştirin.
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)); }
Derleme menüsünde Çözümü Derle'ye tıklayarak projeyi derleyin.
Örnek istemci uygulaması oluşturma
Dosya menüsünde, Yeni'nin üzerine gelin ve Proje'ye tıklayın.
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.
Forma SmoothProgressBar denetiminin iki örneğini eklemek için şu adımları izleyin:
Araçlar menüsünde Araç Kutusu Öğelerini Seç'e tıklayın.
.NET Framework Bileşenleri sekmesine tıklayın.
Gözat'a tıklayın ve özel ProgressBar denetimi oluşturma bölümünde oluşturduğunuz SmoothProgressBar.dll dosyasını bulun.
Tamam'ı tıklatın.
Not
SmoothProgressBar denetimi araç kutusuna eklenir.
SmoothProgressBar denetiminin iki örneğini araç kutusundan Windows Uygulama projesinin varsayılan biçimine sürükleyin.
Zamanlayıcı denetimini araç kutusundan forma sürükleyin.
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; }
Araç kutusundan bir Düğme denetimini forma sürükleyin.
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;
Örnek projeyi çalıştırmak için Hata Ayıkla menüsünde Başlat'a tıklayın.
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin