본문 바로가기
C#

[C#/Winform] 윈폼 기본 구조

by Sein_ 2025. 12. 24.
728x90

Winform의 구성

WinForms 프로젝트는 진입점(Program.cs)폼 클래스(Form1) 로 시작한다.

Form1은 보통 파일이 분리(partial) 되어 관리된다.

  • Program.cs : Main() 을 가진 프로그램 시작 파일 (entry point)
  • Form1.cs : 개발자가 작성하는 로직/이벤트 코드 (partial)
  • Form1.Designer.cs : 디자이너가 자동 생성하는 UI 초기화 코드 (partial)

 

Program.cs

  • Main() 을 가진 프로그램 시작 파일이다.
  • 앱 실행 시 가장 먼저 실행되어 초기 설정을 끝내고, 어떤 폼을 띄울지 결정한다.
  • WinForms 앱이 종료되지 않고 계속 동작하도록 메시지 루프(입력 처리 루프) 를 시작한다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

 

 

Program.cs 코드 분석

 

Application.EnableVisualStyles()

  • Windows의 비주얼 스타일(테마/모양) 을 컨트롤에 적용한다.
  • 폼/컨트롤이 생성되기 전에 호출하는 것이 일반적이다.
  • 기본 컨트롤을 현재 Windows 스타일로 표시하기 위해 실행된다.

Application.SetCompatibleTextRenderingDefault(false)

  • 컨트롤의 기본 텍스트 렌더링 방식을 지정한다.
  • false: GDI 기반 TextRenderer 사용(WinForms 기본 호환/일반 선택).
  • true: GDI+ 기반 Graphics 사용(출력 특성/호환 목적일 때 선택).

Application.Run(new Form1())

  • new Form1() 로 메인 폼 인스턴스를 만든다.
  • 해당 폼을 표시하고 메시지 루프를 시작한다.
  • 루프가 유지되는 동안 클릭/키입력/창 이벤트가 처리되고 앱이 계속 실행된다.
  • 보통 메인 폼이 닫히면 루프가 끝나며 프로그램이 종료된다.

 

Form1.cs / Form1.Designer.cs

  • WinForms에서 폼 1개를 만들면 보통 파일이 2개로 나뉜다.
    • Form1.Designer.cs : 디자이너가 생성·관리하는 UI 초기화 코드 영역
    • Form1.cs : 프로그래머가 작성하는 메시지 처리/이벤트/로직 코드 영역
  • 두 파일은 partial class 로 이루어져 있으므로 결과적으로 컴파일 시 두 파일은 하나의 Form1 클래스로 합쳐진다.

 

Form1.Designer.cs

  • 디자이너는 이 소스 코드를 해석해서 화면에 폼을 그려준다.
  • 폼에 컨트롤을 배치/수정하면 이 파일 내용이 자동으로 바뀐다.
  • 일반적으로 직접 수정하지 않는 편이 안전하다. (디자이너가 덮어쓸 수 있음)
namespace WindowsFormsApp1
{
    partial class Form1
    {
        /// <summary>
        /// 필수 디자이너 변수입니다.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 사용 중인 모든 리소스를 정리합니다.
        /// </summary>
        /// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form 디자이너에서 생성한 코드

        /// <summary>
        /// 디자이너 지원에 필요한 메서드입니다.
        /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 450);
            this.Text = "Form1";
        }

        #endregion
    }
}

 

 

Form1.Designer.cs 코드 분석

 

InitializeComponent()

  • 폼이 생성될 때 컨트롤/윈도우 상태를 초기화하는 메서드다.
  • 디자이너에서 설정한 값(크기/제목/배치/컨트롤 생성 등)이 코드로 기록되어 여기서 실행된다.
  • 폼 생성자에서 InitializeComponent()를 호출하면 디자이너가 만든 UI 상태가 그대로 적용된 폼이 만들어진다.
  • 외부 호출을 막기 위해 private로 둔다.

this.components = new System.ComponentModel.Container();

  • 디자이너가 생성한 컴포넌트를 담아 관리하는 컨테이너다.(예: Timer, ImageList 등)

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

  • 폰트 기준으로 자동 스케일링 방식을 설정한다.

this.ClientSize = new System.Drawing.Size(800, 450);

  • 폼의 클라이언트 영역(내용 영역) 크기를 설정한다.

this.Text = "Form1";

  • 창 제목(타이틀바 텍스트)을 설정한다.

 

Form1.cs

  • Form1 폼 클래스의 사용자 코드 영역이다.
  • 사용자 입력(클릭/키보드 등)으로 발생한 메시지에 대해 “어떻게 반응할지”를 여기에 구현한다.
  • 폼 편집기에서 컨트롤을 더블클릭하면 이벤트 핸들러가 생성되고, 보통 Form1.cs에 작성된다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

 

Form1.cs 코드 분석

 

public Form1()

  • 폼 객체가 생성될 때 실행되는 생성자다.
  • InitializeComponent()를 호출해 디자이너에서 정의된 UI(컨트롤/속성/이벤트 연결)를 초기화한다.
  • 기본적으로 생성자에는 InitializeComponent()만 존재한다.
  • 초기값 세팅, 데이터 로딩 준비, 컨트롤 기본 상태 설정이 필요하면 추가로 작성한다.
public Form1()
{
    InitializeComponent();
    this.Text = "메인 화면";
    button1.Enabled = false;
}