[Windows Forms 응용 with C#] 3.1.2 ColorSelectControl 정의

이제 프로젝트에 사용자 정의 컨트롤 ColorSelectorControl을 추가하고 자식 컨트롤을 배치하세요.

[그림 3.3] ColorSelectorControl 추가
[그림 3.4] 자식 컨트롤 배치

 다음은 ColorSelectControl의 자식 컨트롤 Name과 형식입니다.

NoName컨트롤 형식설명
1spconSpritContainer컨트롤 배치 목적 (2개의 패널로 구성)
2lb_redLabelRed 색상 정보 표시
3lb_greenLabelGreen 색상 정보 표시
4lb_blueLabelBlue 색상 정보 표시
5tbar_redTrackBarRed 색상 값 조절
6tbar_greenTrackBarGreen 색상 값 조절
7tbar_blueTrackBarBlue 색상 값 조절
public partial class ColorSelectorControl : UserControl
{

먼저 ColorChangeEventHandler 형식의 이벤트를 멤버로 추가합니다.

    public event ColorChangeEventHandler ColorChanged=null;

컨트롤을 사용하는 곳에서 색상을 가져오기 할 수 있게 속성을 정의합니다.

    public int Red
    {
        get;
        private set;
    }
    public int Green
    {
        get;
        private set;
    }
    public int Blue
    {
        get;
        private set;
    }

컨트롤이 Load할 때와 각 색상의 트랙바를 스크롤할 때 패널의 배경 색상을 바꿔주고 색상 정보를 표시할 Label의 속성을 설정하는 작업을 수행합니다. 컨트롤의 Load 이벤트, 각 트랙바의 스크롤 이벤트 핸들러를 등록하여 색상을 변경하는 메서드를 호출하세요. 물론 색상을 변경하는 메서드를 추가하세요.

private void ColorSelectorControl_Load(object sender, EventArgs e)
{
    SetColor(COLOR_ELEM.CE_ALL);
}
private void tbar_red_Scroll(object sender, EventArgs e)
{
    SetColor(COLOR_ELEM.CE_RED);
}
private void tbar_green_Scroll(object sender, EventArgs e)
{
    SetColor(COLOR_ELEM.CE_GREEN);
}
private void tbar_blue_Scroll(object sender, EventArgs e)
{
    SetColor(COLOR_ELEM.CE_BLUE);
}

색상을 설정하는 메서드 SetColor를 구현합시다.

private void SetColor(COLOR_ELEM ce)
{

각 트랙바의 Value 속성으로 색상 속성을 설정합니다.

    Red = tbar_red.Value;
    Green = tbar_green.Value;
    Blue = tbar_blue.Value;

또한 색상 정보 표시 레이블의 Text 속성도 설정합니다.

    lb_red.Text = tbar_red.Value.ToString();
    lb_green.Text = tbar_green.Value.ToString();
    lb_blue.Text = tbar_blue.Value.ToString();

색상을 시각적으로 인식할 수 있게 spcon의 Panel1의 배경 색을 설정합니다.

    spcon.Panel1.BackColor = Color.FromArgb(Red, Green, Blue);

만약 색상 변경 이벤트 핸들러가 null이 아니면 색상 변경한 사실을 알리기 위해 이벤트 핸들로를 호출합니다.

    if (ColorChanged != null)
    {
        ColorChanged(this, new ColorChangeEventArgs(Red, Green, Blue, ce));
    }

그리고 ColorSelectorControl 개체를 소유하는 곳에서 프로그램 방식으로 색상을 변경할 수 있게 메서드를 제공합니다. 여기에서는 세 가지 색상을 모두 변경하는 메서드와 단일 색상 값을 변경하는 메서드를 제공합시다.

public void ChangeColor(int r, int g, int b)
{
    tbar_red.Value = (byte)r;
    tbar_green.Value = (byte)g;
    tbar_blue.Value = (byte)b;
    SetColor(COLOR_ELEM.CE_ALL);
}
public void ChangeRed(int r)
{
    tbar_red.Value = (byte)r;
    SetColor(COLOR_ELEM.CE_RED);
}
public void ChangeGreen(int g)
{
    tbar_green.Value = (byte)g;
    SetColor(COLOR_ELEM.CE_GREEN);
}
public void ChangeBlue(int b)
{
    tbar_blue.Value = (byte)b;
    SetColor(COLOR_ELEM.CE_BLUE);
}

▷ColorSelectorControl.cs

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Ex_사용자_정의_컨트롤
{
    public partial class ColorSelectorControl : UserControl
    {
        public event ColorChangeEventHandler ColorChanged=null;
        public int Red
        {
            get;
            private set;
        }
        public int Green
        {
            get;
            private set;
        }
        public int Blue
        {
            get;
            private set;
        }
        public ColorSelectorControl()
        {
            InitializeComponent();
        }
        private void ColorSelectorControl_Load(object sender, EventArgs e)
        {
            SetColor(COLOR_ELEM.CE_ALL);
        }
        private void tbar_red_Scroll(object sender, EventArgs e)
        {
            SetColor(COLOR_ELEM.CE_RED);
        }
        private void tbar_green_Scroll(object sender, EventArgs e)
        {
            SetColor(COLOR_ELEM.CE_GREEN);
        }

        private void tbar_blue_Scroll(object sender, EventArgs e)
        {
            SetColor(COLOR_ELEM.CE_BLUE);
        }
        private void SetColor(COLOR_ELEM ce)
        {
            Red = tbar_red.Value;
            Green = tbar_green.Value;
            Blue = tbar_blue.Value;
            lb_red.Text = tbar_red.Value.ToString();
            lb_green.Text = tbar_green.Value.ToString();
            lb_blue.Text = tbar_blue.Value.ToString();
            spcon.Panel1.BackColor = Color.FromArgb(Red, Green, Blue);
            if (ColorChanged != null)
            {
                ColorChanged(this, 
                       new ColorChangeEventArgs(Red, Green, Blue, ce));
            }
        }
        public void ChangeColor(int r, int g, int b)
        {
            tbar_red.Value = (byte)r;
            tbar_green.Value = (byte)g;
            tbar_blue.Value = (byte)b;
            SetColor(COLOR_ELEM.CE_ALL);
        }
        public void ChangeRed(int r)
        {
            tbar_red.Value = (byte)r;
            SetColor(COLOR_ELEM.CE_RED);
        }
        public void ChangeGreen(int g)
        {
            tbar_green.Value = (byte)g;
            SetColor(COLOR_ELEM.CE_GREEN);
        }
        public void ChangeBlue(int b)
        {
            tbar_blue.Value = (byte)b;
            SetColor(COLOR_ELEM.CE_BLUE);
        } 
    }
}

빌드한 후 Form1을 선택한 후 도구 상자를 확인하면 ColorSelectorControl 을 표시하는 것을 볼 수 있습니다.

[그림 3.5] 도구 상자의 ColorSelectorControl