본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 40편: ProgressBar를 활용한 작업 진행률 표시

by wawManager 2025. 3. 15.

반응형

1. 강의 개요

이번 강의에서는 ProgressBar 컨트롤을 사용하여 작업의 진행 상태를 시각적으로 표시하는 방법을 학습합니다.
ProgressBar는 파일 다운로드, 처리 작업 등 시간 소요 작업의 상태를 사용자에게 제공하는 데 유용합니다.


2. 학습 목표

  1. ProgressBar의 동작 원리를 이해하고 기본 사용법 익히기.
  2. Timer와 ProgressBar를 연동하여 작업 진행률 시뮬레이션.
  3. 작업 완료 시 메시지 표시.

3. ProgressBar란?

ProgressBar는 작업의 진행 상태를 시각적으로 표현하는 Windows Forms 컨트롤입니다.

  • Minimum: 진행률의 시작 값.
  • Maximum: 진행률의 최대 값.
  • Value: 현재 진행률 값.

ProgressBar 주요 속성

속성 설명 예제

Minimum 진행률의 최소 값 progressBar1.Minimum = 0;
Maximum 진행률의 최대 값 progressBar1.Maximum = 100;
Value 현재 진행률 값 progressBar1.Value = 50;
Style 진행 표시 스타일 (Continuous, Blocks 등) progressBar1.Style = ProgressBarStyle.Blocks;

ProgressBar 주요 이벤트

ProgressBar는 이벤트를 직접 제공하지 않지만, 외부 작업(Timer, BackgroundWorker 등)과 연동하여 진행률을 갱신합니다.


4. 실습: ProgressBar를 활용한 작업 진행률 표시

요구사항

  1. ProgressBar를 0%부터 100%까지 채우는 작업 구현.
  2. Timer를 사용해 일정 간격으로 진행률 증가.
  3. 작업 완료 시 메시지 박스를 통해 완료 알림.

폼 구성

컨트롤 타입 이름 텍스트 위치 크기

ProgressBar progressBar1 (없음) 폼 상단 중앙 (300 x 30)
Button btnStart "작업 시작" 폼 하단 중앙 (100 x 30)

코드 작성

Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private Timer timer1;
        private int progressValue;

        public Form1()
        {
            InitializeComponent();
            InitializeProgressBar();
        }

        private void InitializeProgressBar()
        {
            // ProgressBar 설정
            progressBar1.Minimum = 0;
            progressBar1.Maximum = 100;
            progressBar1.Value = 0;

            // Timer 설정
            timer1 = new Timer
            {
                Interval = 100 // 100ms 간격
            };
            timer1.Tick += Timer1_Tick;

            // "작업 시작" 버튼 클릭 이벤트 연결
            btnStart.Click += BtnStart_Click;
        }

        // Timer Tick 이벤트: 진행률 증가
        private void Timer1_Tick(object sender, EventArgs e)
        {
            progressValue += 5; // 진행률 증가
            if (progressValue <= progressBar1.Maximum)
            {
                progressBar1.Value = progressValue;
            }
            else
            {
                timer1.Stop(); // 작업 완료 시 타이머 중지
                MessageBox.Show("작업이 완료되었습니다!", "완료");
            }
        }

        // "작업 시작" 버튼 클릭 이벤트
        private void BtnStart_Click(object sender, EventArgs e)
        {
            if (!timer1.Enabled)
            {
                progressValue = 0; // 진행률 초기화
                progressBar1.Value = 0;
                timer1.Start(); // 타이머 시작
            }
        }
    }
}

Form1.Designer.cs

namespace WindowsFormsApp1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;
        private ProgressBar progressBar1;
        private Button btnStart;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.progressBar1 = new ProgressBar();
            this.btnStart = new Button();
            this.SuspendLayout();

            // progressBar1
            this.progressBar1.Location = new System.Drawing.Point(50, 50);
            this.progressBar1.Name = "progressBar1";
            this.progressBar1.Size = new System.Drawing.Size(300, 30);
            this.progressBar1.TabIndex = 0;

            // btnStart
            this.btnStart.Location = new System.Drawing.Point(150, 100);
            this.btnStart.Name = "btnStart";
            this.btnStart.Size = new System.Drawing.Size(100, 30);
            this.btnStart.TabIndex = 1;
            this.btnStart.Text = "작업 시작";
            this.btnStart.UseVisualStyleBackColor = true;

            // Form1
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(400, 200);
            this.Controls.Add(this.btnStart);
            this.Controls.Add(this.progressBar1);
            this.Name = "Form1";
            this.Text = "ProgressBar 예제";
            this.ResumeLayout(false);
        }
    }
}

5. 실행 결과

  1. 초기 상태
    • ProgressBar는 비어 있고, "작업 시작" 버튼이 활성화되어 있습니다.
  2. 작업 진행
    • "작업 시작" 버튼 클릭 → ProgressBar가 5%씩 증가하며, 작업 진행 상태를 표시합니다.
  3. 작업 완료
    • ProgressBar가 100%에 도달하면 Timer가 중지되고, 완료 메시지가 표시됩니다.

6. 주요 개념 요약

  1. ProgressBar 구성 요소
    • Minimum, Maximum, Value를 설정하여 진행 상태를 제어.
  2. Timer와의 연동
    • Timer를 사용해 일정 간격으로 ProgressBar의 진행률을 업데이트.
  3. 작업 완료 처리
    • ProgressBar의 Value가 Maximum에 도달하면 타이머를 중지하고 작업 완료 처리를 실행.
반응형