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”로 지정하면 된다.
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 { } |
— Property의 Category와 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에서 속성창에 아래와 같이 표시된다. 아래의 그림에서 Category는 “Appearance”로 지정했으므로 BorderStyle은 “모양”에 위치하게되며, 하단에 BorderStyle의 설명이 표시된다.
— Property의 Default 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); } } |
Control의 Event는 기본적으로 C#의 Delegate와 Event 기법을 사용한다. 일반적인 Control에서 발생되는 Event의 Event Handler를 지원하기 위해서는 “sender”와 “Argument”를 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
'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 |
댓글