Visual C# 에서 부드러운 진행률 표시줄을 만드는 방법

기술 자료 번역 기술 자료 번역
기술 자료: 323116 - 이 문서가 적용되는 제품 보기.
이 문서에서는 Microsoft Visual Basic .NET 버전에 323088 참조하십시오.
모두 확대 | 모두 축소

이 페이지에서

요약

이 문서에서는 ProgressBar 컨트롤의 스크롤 부드러운 만들 수 있는 간단한 사용자 지정 UserControl 만드는 방법을 보여 줍니다.

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

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

이 문서의 예제 코드는 다음과 같은 속성을 지원하는 컨트롤을 만드는 방법을 보여 줍니다.
  • 최소. 이 속성에 대한 유효 값 범위에 대해 낮은 값을 설정하거나 가져옵니다. 이 속성의 기본값은 영 (0) 이고, 이 속성을 음수 값으로 설정할 수 없습니다.
  • 최대. 이 속성에 대한 유효 값 범위의 상한 값을 설정하거나 가져옵니다. 이 속성의 기본 값은 100입니다.
  • 값입니다. 이 속성은 진행률 현재 수준을 설정하거나 가져옵니다. 값이 최소최대 속성을 정의하는 범위에 있어야 합니다.
  • ProgressBarColor. 이 속성은 진행률 표시줄의 색을 설정하거나 가져옵니다.

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

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

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

    UserControl에서 파생된 클래스 SmoothProgressBar.cs 파일에서 다음 코드를 추가하십시오.

    참고 Visual Studio .NET 2003에서 코드를 “ Windows Form 디자이너에서 생성한 코드 ” 구역 바로 다음에 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)
    		{
    			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 Forms 응용 프로그램템플릿 차례로 클릭한 다음 확인 을 누릅니다.

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

      참고 Visual Studio .NET 2003 도구 상자 사용자 지정도구 상자 항목 선택 대신 를 클릭하십시오.
    2. .NET Framework 구성 요소 탭을 클릭하십시오.
    3. 찾아보기 를 클릭한 다음 Create a custom ProgressBar control "절에서 만든 SmoothProgressBar.dll 파일을 찾습니다.
    4. 확인 을 클릭하십시오. SmoothProgressBar 컨트롤을 도구 상자에 추가됩니다.
    5. SmoothProgressBar 컨트롤의 두 인스턴스를 도구 상자에서 Windows 응용 프로그램 프로젝트의 기본 폼으로 끌어 옵니다.
  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. 단추를 클릭하십시오. 두 개의 진행률 표시기가 "진행률" 텍스트를 표시하는 알 수 있습니다. 한 진행률 표시기는 증가하는 방식으로 진행률을 표시합니다 및 다른 진행률 표시기를 사용하여 줄이면 또는 카운트다운 방식으로 진행률을 표시합니다.

속성

기술 자료: 323116 - 마지막 검토: 2008년 8월 1일 금요일 - 수정: 4.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# 2008 Express Edition
  • Microsoft Visual C# 2005 Express Edition
키워드:?
kbmt kbsweptvs2008 kbhowtomaster KB323116 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com