매끄러운 진행 막대를 만들어 기존의 Visual C# 하는 방법

이 문서의 Microsoft Visual Basic.NET 버전 323088 를 참조 하십시오.

요약

이 문서는 매끄러운 스크롤 ProgressBar 컨트롤을 만들 수 간단 하 고 사용자 지정 UserControl 를 만드는 방법을 보여줍니다.

ProgressBar 컨트롤 예: Microsoft Windows 공용 컨트롤 ActiveX 컨트롤과 함께 제공 되는 버전의 이전 버전에서는 두 가지 보기로 진행 상태를 볼 수 있습니다. 이러한 보기를 제어 하려면 표준 및 연속 설정이 포함 된 스크롤 속성을 사용 합니다. 부드러운 화면 이동의 진행 상황을 표시 하는 단색 블록을 생성 하 고 표준 스크롤 세그먼트화 된 나타나고 일련의 작은 블록이 나 직사각형으로 이루어집니다.

ProgressBar 컨트롤 사용 하 여 Microsoft Visual C#에 포함 되어 있는 표준 설정만을 지원 합니다.

이 문서의 예제 코드에서는 다음과 같은 속성을 지 원하는 컨트롤을 만드는 방법을 보여 줍니다.

  • 최소. 이 속성을 얻거나 설정 하는 진행률에 대 한 유효 값 범위의 하 한 값. 이 속성의 기본값은 영 (0); 이 속성을 음수 값으로 설정할 수 없습니다.
  • 최대. 이 속성을 얻거나 진행률에 대 한 유효 값 범위의 상한 값을 설정 합니다. 이 속성의 기본값은 100입니다.
  • 입니다. 이 속성을 얻거나 진행 상황 현재 수준을 설정 합니다. 최소최대 속성을 정의 하는 범위의 값 이어야 합니다.
  • ProgressBarColor. 이 속성을 얻거나 진행률 표시줄의 색을 설정 합니다.

사용자 지정 ProgressBar 컨트롤 만들기

  1. 새 Windows 컨트롤 라이브러리 프로젝트를 만들려면 Visual C#에서 다음과 같이 하십시오.
    1. Microsoft Visual Studio 시작 합니다.
    2. 파일 메뉴에서 새로 만들기를 가리키고 프로젝트를 클릭 합니다.
    3. 새 프로젝트 대화 상자에서 프로젝트 형식아래에서 C# 를 클릭 한 다음 템플릿에서 Windows Forms 컨트롤 라이브러리 를 클릭 합니다.

      참고: Visual Studio.NET 2003에서 C#대신 Visual C# 프로젝트 클릭 합니다.
    4. 이름 상자에 SmoothProgressBar입력 하 고 확인을 클릭 합니다.
    5. 프로젝트 탐색기에서 SmoothProgressBar.cs UserControl1.cs에서 기본 클래스 모듈을 이름을 바꿉니다.
    6. UserControl 개체의 속성 창에서 SmoothProgressBarUserControl1 에서 이름 속성을 변경 합니다.
  2. 이 시점에서 일반적으로 해당 컨트롤 클래스에서 상속 및 기존 컨트롤을 확장 하는 추가 기능을 추가 합니다. 그러나 ProgressBar 클래스 봉인 되 고 상속 될 수 없습니다. 따라서 처음부터 컨트롤을 만들어야 합니다.

    UserControl에서 파생 된 클래스에서 SmoothProgressBar.cs 파일에 다음 코드를 추가 합니다.

    참고: Visual Studio.NET 2003에서 "Windows Form 디자이너에서 생성 한 코드" 섹션 바로 다음 파생 된 UserControl 클래스의 클래스 모듈에 코드를 추가 합니다.
    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. 새 프로젝트 추가 대화 상자에서 프로젝트 형식아래에서 C# 를 클릭 서식 파일 Windows Forms 응용 프로그램 을 클릭 하 고 확인을 누릅니다.

    참고: Visual Studio.NET 2003에서 C#대신 Visual C# 프로젝트 클릭 합니다.
  3. 폼에 SmoothProgressBar 컨트롤의 두 인스턴스를 추가 하려면 다음과 같이 하십시오.
    1. 도구 메뉴에서 도구 상자 항목 선택을 클릭 합니다.

      참고: Visual Studio.NET 2003에서 도구 상자 항목을 선택하는 대신 도구 상자 사용자 지정 클릭 합니다.
    2. .NET Framework 구성 요소 탭을 클릭 합니다.
    3. 찾아보기를 클릭 한 다음 "사용자 지정 ProgressBar 컨트롤 만들기" 절에서 만든 SmoothProgressBar.dll 파일을 찾습니다.
    4. 확인을 클릭합니다. 예 고 된 SmoothProgressBar 컨트롤이 도구 상자에 추가 됩니다.
    5. 도구 상자에서 Windows 응용 프로그램 프로젝트의 기본 폼에 SmoothProgressBar 컨트롤의 두 인스턴스를 드래그 합니다.
  4. 도구 상자에서 Timer 컨트롤을 폼으로 끕니다.
  5. Timer 컨트롤의 Tick 이벤트에 다음 코드를 추가 합니다.
    if (this.smoothProgressBar1.Value > 0){
    this.smoothProgressBar1.Value--;
    this.smoothProgressBar2.Value++;
    }
    else
    {
    this.timer1.Enabled = false;
    }

  6. 도구 상자에서 Button 컨트롤을 폼에 끌어.
  7. Button 컨트롤의 Click 이벤트에 다음 코드를 추가 합니다.
    this.smoothProgressBar1.Value = 100;this.smoothProgressBar2.Value = 0;

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

  8. 디버그 메뉴에서 샘플 프로젝트를 실행 하려면 시작 을 클릭 합니다.
  9. 단추를 클릭 합니다. 두 개의 진행률 표시기 "진행률" 텍스트를 표시 하는 확인 합니다. 한 진행률 표시기는 증가 방식에서 진행 상태가 표시 됩니다 하 고 진행률 표시기는 카운트 다운 방식으로 진행률을 표시 합니다.
속성

문서 ID: 323116 - 마지막 검토: 2017. 2. 7. - 수정: 1

피드백