본문 바로가기
  • 읽고보고쓰고
PROGRAMMING/C#

CS CustomControl Part2

by 체리그루브 2012. 2. 22.
728x90

 

4. Property

C#은 다른 Language와 달리 Property를 언어차원에서 지원한다. 따라서 Control Property 또한 별도의 방법을 사용하지 않고, C# Property를 그대로 사용하며, 이에 따라 추가된 Property는 자동으로 Control의 속성창에 표시된다. 이는 Custom Control, User Control 모두 적용된다.

 

일반적인 Property의 추가

Propery를 추가하기 위해서는 C# Property(set/get)를 구현한다.

private int intProp;

 

public int IntProp

{

   get { return intProp; }

   set { intProp = value; }

}

위와 같은 Code를 추가하면 IntProp 이라는 속성이 추가되고 이는 Container에서 속성창에 같은 이름으로 표시된다.

 

열거형 Property의 추가

속성창에서 ComboBox로 표시되는 열거형 속성은 아래와 같이 Propety의 리턴타입을 열거형으로 지정하면 자동으로 ComboBox형태로 표시된다.

아래는 Panel의 외곽선 형태를 6가지 형태중 선택하도록 하는 예제이다.

public enum BorderStyles

{

   None,

   FixedSingle,

   Fixed3D_Raised,

   Fixed3D_Sunken,

   Line_Raised,

   Line_Sunken

}

 

private BorderStyles m_BorderStyle = BorderStyles.Line_Raised;

 

public new BorderStyles BorderStyle

{

   get { return m_BorderStyle; }

   set

   {

       m_BorderStyle = value;

       this.Invalidate();

   }

}

 

위와 같이 열거형으로 속성을 추가하면 Container에서 사용시 속성창에 아래와 같이 ComboBox의 형태로 표시된다.

 

 

Color 선택형 Property의 추가

색상을 선택할 수 있는 Property는 단지 Property의 리턴형을 Color로 지정하면 된다.

private Color borderColor = Color.Black;

 

public Color BorderColor

{

   get

   {

       return m_ borderColor;

   }

   set

   {

       borderColor = value;

       this.Invalidate();

   }

}

 

Font 선택형 Property의 추가

Font를 선택할 수 있는 Property Color와 마찬가지로 Property의 리턴형을 Font로 지정하면 된다.


 

5. For Design Time

Custom Control Design Time에 보다 편리하게 사용할 수 있도록 하기 위하여 C#에서는 몇가지 도구를 지원한다. 여기에서는 주로 C#의 새로운 특징인 Attribute를 이용한 부가 기능을 설명한다.

 

Control Icon 설정

도구에 표시될 Control Icon을 지정하기 위해서는 ToolboxBitmap Attribute를 사용한다.

ToolboxBitmap Attribute의 자세한 내용은 ToolboxBitmapAttribute Class를 참조한다.

Control Icon을 지정하기 위해서는 아래의 방법을 사용할 수 있다.

 

1. 기존의 Control Icon을 사용

기존의 Control Icon을 그대로 적용시킬 경우, 아래와 같이 typeof를 사용한다. 괄호안의 내용은 원하는 Control Class 명을 기술한다. 아래의 예제는 버튼 Control과 동일한 Icon을 지정하는 방법이다.

[ToolboxBitmap(typeof(Button))]

class MyControl1 : UserControl

{

}

 

2. 임의의 Bitmap 파일을 지정

임의의 Bitmap 파일의 Path를 지정한다.

[ToolboxBitmap(@"C:\myImage.bmp")]

class MyControl2 : UserControl

{

}

 

3. Assembly 내의 Resource를 사용

아래와 같이 Resource를 찾을 Assembly명과 Resource 명을 기술한다.

[ToolboxBitmap(typeof(MyControl), "MyControlBitmap")]

class MyControl : UserControl

{

}

 


 

PropertyCategory Description 설정

Control Property가 속성창에 위치할 Category Property를 선택한 경우, 하단에 표시되는 설명을 지정할 수 있다. 이는 각각 Category, Description Attribute를 이용하여 지정가능하다.

[Description("패널 테두리의 모양을 지정합니다."), Category("Appearance")]

public new BorderStyles BorderStyle

{

   get

   {

      return m_BorderStyle;

   }

   set

   {

      m_BorderStyle = value;

      this.Invalidate();

   }

}

 

위와 같이 Attribute를 여러 개 나열할 수도 있다. 위와 같이 Category Propery를 지정하면, Container에서 속성창에 아래와 같이 표시된다. 아래의 그림에서 CategoryAppearance로 지정했으므로 BorderStyle모양에 위치하게되며, 하단에 BorderStyle의 설명이 표시된다.

 

 

PropertyDefault Value 설정

Property에 미리 기본값을 설정할 수 있다. 이는 DefaultValue Attribute를 이용한다.

아래는 Default Value를 지정하는 예이다.

[Description("패널 테두리의 모양을 지정합니다."), Category("Appearance")]

[DefaultValue("Line_Raised")]

public new BorderStyles BorderStyle

{

    get

    {

      return m_BorderStyle;

    }

    set

    {

       m_BorderStyle = value;

       this.Invalidate();

    }

}

 

[Description("패널의 테두리에 사용되는 색입니다."), Category("Appearance")]

[DefaultValue(typeof(Color), "Black]

public Color BorderColor

{

    get

    {

       return m_BorderColor;

    }

    set

    {

       m_BorderColor = value;

       this.Invalidate();

    }

}

 

Property의 속성창 표시여부 설정

Control Property , Runtime에만 사용하고 Design Time의 속성창에는 표시되지 않기를 원하는 Property가 존재할 수 있다. 이와 같이 Property의 속성창 표시여부를 지정하고자 하는 경우, Browsable Attribute를 사용한다.

아래와 같이 [Browsable(false)] 로 지정된 속성은 Design Time시 속성창에 표시되지 않는다.

 

[Browsable(false)]

public new string SelectedText

{

    get

    {

       if(this.SelectedIndex > 0)

          return Items[this.SelectedIndex].ToString();

       else

          return "";

    }

    set

    {

       this.SelectedIndex = Items.IndexOf(value);

    }

}


 

6. Event

Control Event는 기본적으로 C# Delegate Event 기법을 사용한다. 일반적인 Control에서 발생되는 Event Event Handler를 지원하기 위해서는 senderArgument Parameter로 가지는 Delegate를 사용한다. (이는 공용 Control의 모든 Event Handler가 가지는 기본 Parameter이다) 또한 Control Event에 고유한 Argument를 지원하기 위하여 EventArgs Class에서 상속받는 새로운 Argument Type을 지정한다.

 

Event의 추가

1. Argument 정의

Control Class Event Argument로 받을 Type을 지정한다. 아래는 단순하게 Argument string값을 넘기기 위한 예이다.

public class MyEventArgs : EventArgs

{

    public MyEventArgs(string s)

    {

       textValue = s;

    }

 

    private string textValue;      // string값의 Argument를 지원

 

    public string TextValue

    {

       get { return textValue; }

       set { textValue = value; }

    }

}

 

2. Delegate 정의

Event로 사용할 Delegate Event를 지정한다. 항상 아래와 같은 형태로 사용하도록 한다.

public delegate void MyEventHandler(object sender, MyEventArgs e);

public event MyEventHandler MyEvent;

 

3. Event 발생

Event가 발생해야 하는 특정상황에서 위에서 정의한 Event를 호출한다.

private void SomeFn()

{

    MyEventArgs args = new MyEventArgs("This is Event Test");

    if(MyEvent != null)

    {

       MyEvent(this, args);

    }

}

 

위와 같은 과정을 거치면 Control의 속성창에 이벤트 항목을 클릭하면 아래와 같이 Event가 추가됨을 확인 할 수 있다.

 

 

그리고 이를 이용하여 Event Handler를 추가할 수 있게 된다.

private void userControl11_MyEvent(object sender, CustomControl.UserControl1.MyEventArgs e)

{

    MessageBox.Show(e.TextValue);

}

 

 

출처 : http://rainiac.com/lecture/CS/CS_CustomControl_Part2.htm

728x90

'PROGRAMMING > C#' 카테고리의 다른 글

색상 주기 코드 C#  (0) 2012.02.23
NameValueCollection 사용하기  (0) 2012.02.23
CS CustomControl Part1  (0) 2012.02.22
Delegate & Event  (0) 2012.02.22
Windows Message override하기  (0) 2012.02.22

댓글