C#/Control

[C#] 스위치 컨트롤 만들기

쓰봥 2025. 5. 4. 09:00
SMALL

C# WinForms에서 사용자 정의 스위치 컨트롤(WitSwitch) 구현 방법

C# WinForms에서는 기본적으로 토글 스위치 형태의 컨트롤이 제공되지 않습니다. 보다 시각적이고 직관적인 스위치를 구현하고자 할 경우, 사용자 정의 컨트롤(UserControl)을 통해 직접 제작하는 방식이 효과적입니다. 이번 글에서는 'WitSwitch'라는 이름의 커스텀 스위치 컨트롤을 만드는 방법을 구조적으로 정리합니다.

 

WitSwitch의 주요 기능 구성

WitSwitch 컨트롤은 단순히 클릭만 처리하는 것이 아니라, 애니메이션 기반으로 상태 전환을 시각적으로 표현합니다. 구성 요소는 다음과 같습니다.

  1. 상태에 따라 색상과 위치가 변하는 원형 슬라이드
  2. GraphicsPath를 활용한 둥근 테두리
  3. 클릭 시 애니메이션을 구동하는 Timer
  4. 외부 이벤트 연동을 위한 OnSwitch 이벤트

 

 

핵심 필드 및 속성 설명

WitSwitch는 내부적으로 다양한 상태와 색상 변수를 보유하고 있으며, 이를 통해 동작을 커스터마이징할 수 있습니다. 대표적인 속성은 다음과 같습니다.

  1. OnBorderColor / OffBorderColor: 스위치 테두리 색상
  2. OnCircleColor / OffCircleColor: 슬라이드 원 색상
  3. IsOn: 현재 On/Off 상태

이 외에도 외부 UI에서 상태 전환을 감지할 수 있도록 OnSwitch 이벤트가 선언되어 있습니다.

 

애니메이션을 위한 Timer 구성

토글 시 부드러운 움직임을 위해 System.Windows.Forms.Timer를 활용합니다. 초기화 코드는 다음과 같이 작성합니다.

 

private Timer switch_timer;

private void InitializeComponent()
{
    this.switch_timer = new Timer();
    this.switch_timer.Interval = 10;
    this.switch_timer.Tick += switch_timer_Tick;
}

타이머는 슬라이드 좌표인 _slide를 단계별로 갱신하며, 최종 위치 도달 시 Stop() 됩니다.

마우스 클릭 및 그리기 이벤트 처리

사용자가 마우스로 클릭하면 On/Off 상태가 반전되며, 슬라이드 애니메이션이 시작됩니다. 아래는 클릭 이벤트 처리 예시입니다.

protected override void OnMouseClick(MouseEventArgs e)
{
    if (switch_timer.Enabled)
        return;

    _isOn = !_isOn;

    OnSwitch?.Invoke(this, EventArgs.Empty);
    switch_timer.Start();

    base.OnMouseClick(e);
}

 

또한 OnPaint()에서는 상태에 따라 색상이 달라지고, GraphicsPathDrawCircle()로 도형을 그립니다.

 

활용 팁 및 확장 아이디어

WitSwitch는 다음과 같은 방식으로 확장 가능합니다.

  1. 컨트롤 텍스트 라벨 삽입 (예: "켜짐" / "꺼짐")
  2. 슬라이드 속도 조절 (step 값 조정)
  3. 디자인 테마에 맞는 색상 자동 변경

실제 프로젝트에서는 상태 전환 시 외부 데이터 처리와 연계하거나, 사용자 설정을 반영하는 UI 요소로도 활용할 수 있습니다.