WinForm 개념, 구조, 예제

doyeon kim·2025년 2월 6일

C#

목록 보기
13/13

🎯 WinForms

Microsoft의 .NET Framework 및 .NET Core에서 제공하는 GUI(Graphical User Interface) 프레임워크

✅ WinForms의 특징

🔹 1. 이벤트 기반 프로그래밍

  • 사용자의 클릭, 키 입력, 마우스 이동 등의 이벤트에 반응하여 동작하는 방식
    -> 예: 버튼을 클릭하면 메시지 박스를 띄우기

🔹 2. 쉽고 직관적인 UI 디자인

  • Visual Studio의 디자인 모드를 사용하여 드래그 앤 드롭 방식으로 UI를 배치할 수 있음
  • 속성 창(Properties)에서 크기, 색상, 글꼴 등을 손쉽게 설정 가능

🔹 3. 빠른 개발 속도

  • 디자인 모드 + 이벤트 기반 프로그래밍 덕분에 개발 속도가 빠름
  • 간단한 데스크톱 애플리케이션을 신속하게 제작할 수 있음

✅ 📌 WinForms 프로젝트 구조

새 프로젝트 -> Window Forms 앱(.NET Framework) 로 생성

📂 YourProject
┣ 📄 MainForm.cs // (사용자 코드 - 이벤트 핸들러, 비즈니스 로직)
┣ 📄 MainForm.Designer.cs // (디자인 코드 - UI 요소 자동 생성)
┣ 📄 MainForm.resx // (리소스 파일 - 문자열, 이미지, 아이콘 등 저장)
┗ 📄 Program.cs // (프로그램 시작점 - Main() 메서드)

1️⃣ MainForm.cs - 사용자 코드 파일

사용자가 직접 작성하는 코드
이 파일에서는 버튼 클릭 이벤트, 데이터 처리, 비즈니스 로직 등을 작성

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent(); // 폼 디자인 초기화 (Designer.cs의 코드 실행)
    }

    private void btnAdd_Click(object sender, EventArgs e) //버튼 추가 시 발생하는 메서드
    {
        MessageBox.Show("버튼이 클릭되었습니다!");
    }
}

2️⃣ MainForm.Designer.cs - 자동 생성된 UI 코드 파일

Visual Studio 디자인 모드에서 UI 요소를 추가하면, 자동으로 관리되는 코드
이 파일은 "디자인 모드에서 추가한 컨트롤(Button, TextBox 등)"을 C# 코드로 변환해 저장하는 곳

약간 디자인을 글로 옮겨적은 느낌 -> 디자인 수정 시 알아서 변함

partial class MainForm
{
    private System.Windows.Forms.Button btnAdd;

    private void InitializeComponent()
    {
        this.btnAdd = new System.Windows.Forms.Button();
        this.SuspendLayout();

        // 
        // btnAdd
        // 
        this.btnAdd.Location = new System.Drawing.Point(50, 50);
        this.btnAdd.Name = "btnAdd";
        this.btnAdd.Size = new System.Drawing.Size(100, 30);
        this.btnAdd.Text = "추가";
        this.btnAdd.UseVisualStyleBackColor = true;
        this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);

3️⃣ MainForm.resx - 리소스(Resource) 파일

이미지, 문자열, 아이콘 같은 리소스 데이터를 저장하는 XML 기반 파일
이 파일은 Designer.cs에서 UI 요소의 텍스트, 이미지, 로컬라이제이션(다국어 지원) 등을 관리


예제1 (버튼 클릭)

도구 상자 -> 버튼을 드래그해서 버튼을 생성하고 Name,Text 설정

이후 버튼을 더블클릭(or F7) 하면 코드 부분으로 이동, 자동으로 버튼 클릭 메서드가 선언된다.

namespace WinFormsApp1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           // sender를 Button으로 캐스팅
           Button clickedButton = sender as Button;

           if (clickedButton != null) // null 체크 (안전한 캐스팅)
           {
               clickedButton.Location = new System.Drawing.Point(100, 100);  // 버튼 위치 설정
               clickedButton.Size = new System.Drawing.Size(300, 300);       // 버튼 크기 설정
               clickedButton.BackColor = System.Drawing.Color.LightGreen;    // 버튼 색 설정
               clickedButton.ForeColor = System.Drawing.Color.Red;           // 버튼 내부 텍스트 색 설정
           }

           MessageBox.Show("Hello, WinForms!", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);  //알림 창 출력
       }
   }
}
       }

실행화면


예제2 (To-do-List)

textbox 에 내용 입력 후 추가 누르면 listbox 에 추가, listbox 의 내용 클릭 후 삭제 누르면 삭제됨

코드

namespace TodoListApp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        // "추가" 버튼 클릭 이벤트
        private void BtnAdd_Click(object sender, EventArgs e)
        {
            string task = txtTask.Text.Trim(); // 입력값 가져오기(빈칸 제거)

            if (!string.IsNullOrEmpty(task)) // 빈 값 방지
            {
                listBoxTasks.Items.Add(task); // 리스트에 추가
                txtTask.Clear(); // 입력창 초기화
                txtTask.Focus(); // 입력창 다시 선택
            }
            else
            {
                MessageBox.Show("할 일을 입력하세요!", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        // "삭제" 버튼 클릭 이벤트
        private void BtnRemove_Click(object sender, EventArgs e)
        {
            if (listBoxTasks.SelectedItem != null) // 선택된 항목이 있을 경우
            {
                listBoxTasks.Items.Remove(listBoxTasks.SelectedItem); // 선택된 항목 삭제
            }
            else
            {
                MessageBox.Show("삭제할 항목을 선택하세요!", "알림", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
    }
}

0개의 댓글