Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera informacje o sposobie tworzenia niestandardowej kontrolki UserControl w celu utworzenia płynnej, przewijającej kontrolki ProgressBar.
Oryginalna wersja produktu: Visual C#
Oryginalny numer KB: 323116
Podsumowanie
W tym artykule pokazano, jak utworzyć prostą niestandardową kontrolkę UserControl w celu utworzenia płynnej, przewijającej kontrolki ProgressBar.
We wcześniejszych wersjach kontrolki ProgressBar, takich jak wersja dostarczana z kontrolką ActiveX kontrolek Common Controls systemu Microsoft Windows, można wyświetlić postęp w dwóch różnych widokach. Aby kontrolować te widoki, należy użyć właściwości Przewijanie, która zawiera standardowe i płynne ustawienia. Płynne przewijanie tworzy solidny blok koloru, który reprezentuje postęp, a standardowe przewijanie pojawia się segmentowane i składa się z serii małych bloków lub prostokątów.
Kontrolka ProgressBar dołączona do języka Microsoft Visual C# obsługuje tylko standardowe ustawienie.
Przykładowy kod w tym artykule ilustruje sposób tworzenia kontrolki obsługującej następujące właściwości:
- Minimum: ta właściwość uzyskuje lub ustawia niższą wartość zakresu prawidłowych wartości dla postępu. Wartość domyślna tej właściwości to zero (0); nie można ustawić tej właściwości na wartość ujemną.
- Maksymalna: ta właściwość uzyskuje lub ustawia górną wartość zakresu prawidłowych wartości dla postępu. Wartość domyślna tej właściwości to 100.
- Wartość: ta właściwość uzyskuje lub ustawia bieżący poziom postępu. Wartość musi znajdować się w zakresie zdefiniowanym przez właściwości Minimum i Maksimum.
- ProgressBarColor: ta właściwość uzyskuje lub ustawia kolor paska postępu.
Tworzenie niestandardowej kontrolki ProgressBar
Wykonaj następujące kroki, aby utworzyć nowy projekt Biblioteki kontrolek systemu Windows w programie Visual C#:
Uruchom Microsoft Visual Studio.
W menu Plik wskaż polecenie Nowy, a następnie kliknij Projekt.
W oknie dialogowym Nowy projekt kliknij pozycję Visual C# w obszarze Typy projektów, a następnie kliknij pozycję Biblioteka kontrolek formularzy systemu Windows w obszarze Szablony.
W polu Nazwa wpisz SmoothProgressBar, a następnie kliknij przycisk OK.
W Eksploratorze projektów zmień nazwę domyślnego modułu klasy z UserControl1.cs na SmoothProgressBar.cs.
W oknie Właściwości obiektu UserControl zmień właściwość Name z UserControl1 na SmoothProgressBar.
W tym momencie zwykle dziedziczysz z klasy tej kontrolki, a następnie dodajesz dodatkowe funkcje, aby rozszerzyć istniejącą kontrolkę. Jednak klasa ProgressBar jest zapieczętowana i nie może być dziedziczona. W związku z tym należy utworzyć kontrolkę od początku.
Dodaj następujący kod do pliku SmoothProgressBar.cs w klasie pochodzącej z kontrolki UserControl.
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)); }W menu Kompilacja kliknij pozycję Kompiluj rozwiązanie, aby skompilować projekt.
Tworzenie przykładowej aplikacji klienckiej
W menu Plik wskaż polecenie Nowy, a następnie kliknij Projekt.
W oknie dialogowym Dodawanie nowego projektu kliknij pozycję Visual C# w obszarze Typy projektów, kliknij pozycję Aplikacja formularzy systemu Windows w obszarze Szablony, a następnie kliknij przycisk OK.
Wykonaj następujące kroki, aby dodać do formularza dwa wystąpienia kontrolki SmoothProgressBar:
W menu Narzędzia kliknij pozycję Wybierz elementy przybornika.
Kliknij kartę Składniki programu .NET Framework.
Kliknij przycisk Przeglądaj, a następnie znajdź plik SmoothProgressBar.dll utworzony w sekcji Tworzenie niestandardowego kontrolki ProgressBar.
Kliknij przycisk OK.
Uwaga 16.
Kontrolka SmoothProgressBar jest dodawana do przybornika.
Przeciągnij dwa wystąpienia kontrolki SmoothProgressBar z przybornika do domyślnej formy projektu aplikacji systemu Windows.
Przeciągnij kontrolkę Czasomierz z przybornika do formularza.
Dodaj następujący kod do
Tickzdarzenia kontrolki Czasomierz:if (this.smoothProgressBar1.Value > 0) { this.smoothProgressBar1.Value--; this.smoothProgressBar2.Value++; } else { this.timer1.Enabled = false; }Przeciągnij kontrolkę Przycisk z przybornika do formularza.
Dodaj następujący kod do
Clickzdarzenia kontrolki Przycisk:this.smoothProgressBar1.Value = 100; this.smoothProgressBar2.Value = 0; this.timer1.Interval = 1; this.timer1.Enabled = true;W menu Debugowanie kliknij przycisk Start, aby uruchomić przykładowy projekt.
Kliknij przycisk .
Uwaga 16.
Dwa wskaźniki postępu wyświetlają postęp tekstu. Jeden wskaźnik postępu wyświetla postęp w sposób rosnący, a drugi wskaźnik postępu wyświetla postęp w sposób malejący lub odliczania.