닷넷 컨트롤 제작
VS.NET이 기본적으로 제공하는 컨트롤이 부족한 경우나 기 제공된 기능이 미약 할 수도 있다. 이런 경우를 위해 닷넷에서는 개발자가 직접 컨트롤을 작성 할 수 있는 수단을 제공 하는데 바로 "Windows Control Library" 이다. 개발자가 컨트롤을 만드는 방법은 크게 두가지로 나뉘어 진다.
VS.NET이 기본적으로 제공하는 컨트롤이 부족한 경우나 기 제공된 기능이 미약 할 수도 있다. 이런 경우를 위해 닷넷에서는 개발자가 직접 컨트롤을 작성 할 수 있는 수단을 제공 하는데 바로 "Windows Control Library" 이다. 개발자가 컨트롤을 만드는 방법은 크게 두가지로 나뉘어 진다.
1. 기존 컨트롤을 이용해서 새 컨트롤을 만든다. 기존 컨트롤을 합쳐 새로운 인터페이스를 만들거나 기존 컨트롤의 기능에 특별한 기능을 추가 하는 등의 경우에 쓰인다. 이렇게 만든 컨트롤을 사용자 컨트롤(User Control) 또는 조합 컨트롤(Composit Control)이라고 부른다. System.Windows.Forms.UserControl을 상속 한다. 이 기반 클래스는 닷넷 컨트롤이 가져야 되는 기본적인 기능들을 정의하므로 이 클래스를 상속하면 컨트롤의 기본적인 기능은 신경 쓰지 않고 해당 컨트롤에 국한된 기능에만 집중 할 수 있다.
2. 완전히 새로운 컨트롤을 만든다. 이는 기존 컨트롤에 없는 어떠한 기능이나 인터페이스를 구현하려 할 때 쓰인다. 이런 컨트롤은 사용자 인터페이스를 자신이 그려야 하는데 이것을 사용자 정의 컨트롤(Custom Control) 이라 한다.
참고 : VS 6.0에서 쓰이던 ActiveX Control은 확장자가 ocx인 특별한 종류의 파일인데, 그 파일은 본질적으로 COM DLL 이다. 닷넷에서는 컨트롤이 다른 어셈블리와 동일한 형태로 존재 하며 OCX 확장자는 더 이상 쓰이지 않는다. 일반적으로 닷넷 콘트롤은 DLL로 존재 한다.
[LabelText 박스 예제]
라벨과 텍스트 박스의 기능을 합친 하나의 컨트롤을 만들어 보자. 프로그램 제작시 레이블을 만들고 옆에 텍스트 박스를 추가하는 경우가 자주 있는데 이 경우 사용 할 컨트롤 이다.
라벨과 텍스트 박스의 기능을 합친 하나의 컨트롤을 만들어 보자. 프로그램 제작시 레이블을 만들고 옆에 텍스트 박스를 추가하는 경우가 자주 있는데 이 경우 사용 할 컨트롤 이다.
1. VS.NET에서 "Windows 컨트롤 라이브러리" 프로젝트를 만든다. 프로젝트 이름은 적당히 기술 하자.
2. 나타난 디자인 화면에서 컨트롤의 이름을 "ctlLabelText"로 부여 하자.
3. 좌측의 도구 상자에서 Label을 추가하고 이름을 "lblLabelText", Text를 "Label", Autosize를 true로 하자.
4. 마찬가지로 TextBox를 하나 추가하고 Name을 "txtLabelText", Txt 속성을 지운다.
5. 사용자가 폼의 어디에 이 LAbelText 컨트롤을 올릴지는 모르므로 그안의 레이블과 텍스트의 위치를 결정하는 코드를 작성해야 한다. 우선 컨트롤안의 개별 컨트롤의 위치를 결정하는 두가지 속성을 추가하자. 하나는 레이블과 텍스트 상자의 상대적 위치를 결정하는 Position으로 Right, Below라는 값을 가진다. 또 하나는 Position이 Right 일때만 적용되는 TextBoxMargin으로 이것은 컨트롤의 왼쪽 가장자리에서부터 텍스트 상자가 시작되는 위치 사이의 너비(픽셀)를 의미한다. 사용자가 이속성을 0으로 하면 테스트 상자의 오른쪽 가장자리가 컨트롤의 오른쪽 가장 자리에 뿥는다.
6. 컨트롤 프로젝트의 코드 편집기에 다음의 코드를 추가 한다.
private System.Windows.Forms.Label lblTextBox;
private System.Windows.Forms.TextBox txtLabelText;
2. 나타난 디자인 화면에서 컨트롤의 이름을 "ctlLabelText"로 부여 하자.
3. 좌측의 도구 상자에서 Label을 추가하고 이름을 "lblLabelText", Text를 "Label", Autosize를 true로 하자.
4. 마찬가지로 TextBox를 하나 추가하고 Name을 "txtLabelText", Txt 속성을 지운다.
5. 사용자가 폼의 어디에 이 LAbelText 컨트롤을 올릴지는 모르므로 그안의 레이블과 텍스트의 위치를 결정하는 코드를 작성해야 한다. 우선 컨트롤안의 개별 컨트롤의 위치를 결정하는 두가지 속성을 추가하자. 하나는 레이블과 텍스트 상자의 상대적 위치를 결정하는 Position으로 Right, Below라는 값을 가진다. 또 하나는 Position이 Right 일때만 적용되는 TextBoxMargin으로 이것은 컨트롤의 왼쪽 가장자리에서부터 텍스트 상자가 시작되는 위치 사이의 너비(픽셀)를 의미한다. 사용자가 이속성을 0으로 하면 테스트 상자의 오른쪽 가장자리가 컨트롤의 오른쪽 가장 자리에 뿥는다.
6. 컨트롤 프로젝트의 코드 편집기에 다음의 코드를 추가 한다.
private System.Windows.Forms.Label lblTextBox;
private System.Windows.Forms.TextBox txtLabelText;
public enum PositionEnum
{
Right,
Below
}
{
Right,
Below
}
//속성값을 실제로 저장 할 두 필드
private PositionEnum mPosition = PositionEnum.Right;
private int mTextBoxMargin = 0;
private PositionEnum mPosition = PositionEnum.Right;
private int mTextBoxMargin = 0;
//속성(Position)을 추가하자
public PositionEnum Position
{
get
{
return mPosition;
}
public PositionEnum Position
{
get
{
return mPosition;
}
set
{
mPosition = value;
MoveControls();
}
}
{
mPosition = value;
MoveControls();
}
}
//속성(TextBoxMargin)을 추가하자
public int TextBoxMargin
{
get
{
return mTextBoxMargin;
}
public int TextBoxMargin
{
get
{
return mTextBoxMargin;
}
set
{
mTextBoxMargin = value;
MoveControls();
}
}
{
mTextBoxMargin = value;
MoveControls();
}
}
7. 사용자가 컨트롤을 폼위에 올려 놓으면 Load 이벤트가 발생 한다. 이 이벤트가 발생 했을 때 주로 컨트롤들이 사용하는 자원들의 초기화가 진행된다. 이 예제에서는 이 이벤트를 통해 내부 컨트롤의 초기 위치와 전체 컨트롤의 크기를 결정 한다. 또하나의 이벤트는 SizeChanged로 이는 컨트롤의 크기가 변할 때 마다 발생되는 이벤트 이다. 아래의 코드를 컨트롤의 생성자에 등록 하자.
public ctlLabelText()
{
// 이 호출은 Windows.Forms Form 디자이너에 필요합니다.
InitializeComponent();
public ctlLabelText()
{
// 이 호출은 Windows.Forms Form 디자이너에 필요합니다.
InitializeComponent();
// TODO: InitComponent를 호출한 다음 초기화 작업을 추가합니다.
//SizeChanged 이벤트 추가
this.SizeChanged += new System.EventHandler(this.OnSizeChanged);
this.SizeChanged += new System.EventHandler(this.OnSizeChanged);
//Load 이벤트 처리기 등록
this.Load += new EventHandler(this.OnLoad);
}
8. 아래의 이벤트 처리기를 추가하자.
private void OnLoad(object sender, EventArgs e)
{
lblTextBox.Text = this.Name;
this.Load += new EventHandler(this.OnLoad);
}
8. 아래의 이벤트 처리기를 추가하자.
private void OnLoad(object sender, EventArgs e)
{
lblTextBox.Text = this.Name;
//컨트롤의 높이를 설정
this.Height = txtLabelText.Height + lblLabelText.Height;
}
this.Height = txtLabelText.Height + lblLabelText.Height;
}
private void OnSizeChanged(object sender, EventArgs e)
{
MoveControls();
}
{
MoveControls();
}
9. MoveControls 메소드를 추가 하자.
private void MoveControls()
{
switch (mPosition)
{
case PositionEnum.Below:
//텍스트 박스를 레이블의 아래에
this.txtLabelText.Top = this.lblLabelText.Bottom;
this.txtLabelText.Left = this.lblLabelText.Left;
private void MoveControls()
{
switch (mPosition)
{
case PositionEnum.Below:
//텍스트 박스를 레이블의 아래에
this.txtLabelText.Top = this.lblLabelText.Bottom;
this.txtLabelText.Left = this.lblLabelText.Left;
//텍스트박스의 너비를 컨트롤의 너비와 같게 만든다.
this.txtLabelText.Width = this.Width;
this.Height = this.txtLabelText.Height + this.lblLabelText.Height;
break;
case PositionEnum.Right:
//텍스트 박스의 top과 레이블의 top을 같게
this.txtLabelText.Top = this.lblLabelText.Top;
//여백이 0이면 텍스트박스를 레이블의 바로 옆에 위치 시킨다.
if (this.mTextBoxMargin == 0)
{
int width = this.Width - this.lblLabelText.Width - 3;
this.txtLabelText.Left = this.lblLabelText.Right + 3;
this.txtLabelText.Width = width;
}
else
{
this.txtLabelText.Left = this.mTextBoxMargin;
this.txtLabelText.Width = this.Right - this.mTextBoxMargin;
}
break;
}
}
10. 컨트롤의 디버깅을 위해 컨트롤 프로젝트가 열려 있는 상태에서 새로운 프로젝트를 추가하자. ("솔루션에 추가" 를 선택, 프로젝트 이름은 "LabelTextBoxText" 라고 하자)
11. 솔루션 탐색기를 보면 이전에 만든 LabelTextControl 프로젝트가 진하게 되어 있을 것이다,. 이는 시작 프로젝트의 의미인데 컨트롤이 시작 할 수는 없으므로 LabelTextBoxText에서 마우스 우측 버튼을 눌러 [시작 프로젝트로 설정]을 선택 하자.
12. [LabelTextBoxText] 프로젝트에서 솔루션 탐색기의 참조를 이용하여 "LabelTextControl"을 참조하자.(아마도 프로젝트 탭에 "LabelTextControl"이 나와 있을 것이다.) 선택 후 확인 하자.
13. 실행 후 확인
this.txtLabelText.Width = this.Width;
this.Height = this.txtLabelText.Height + this.lblLabelText.Height;
break;
case PositionEnum.Right:
//텍스트 박스의 top과 레이블의 top을 같게
this.txtLabelText.Top = this.lblLabelText.Top;
//여백이 0이면 텍스트박스를 레이블의 바로 옆에 위치 시킨다.
if (this.mTextBoxMargin == 0)
{
int width = this.Width - this.lblLabelText.Width - 3;
this.txtLabelText.Left = this.lblLabelText.Right + 3;
this.txtLabelText.Width = width;
}
else
{
this.txtLabelText.Left = this.mTextBoxMargin;
this.txtLabelText.Width = this.Right - this.mTextBoxMargin;
}
break;
}
}
10. 컨트롤의 디버깅을 위해 컨트롤 프로젝트가 열려 있는 상태에서 새로운 프로젝트를 추가하자. ("솔루션에 추가" 를 선택, 프로젝트 이름은 "LabelTextBoxText" 라고 하자)
11. 솔루션 탐색기를 보면 이전에 만든 LabelTextControl 프로젝트가 진하게 되어 있을 것이다,. 이는 시작 프로젝트의 의미인데 컨트롤이 시작 할 수는 없으므로 LabelTextBoxText에서 마우스 우측 버튼을 눌러 [시작 프로젝트로 설정]을 선택 하자.
12. [LabelTextBoxText] 프로젝트에서 솔루션 탐색기의 참조를 이용하여 "LabelTextControl"을 참조하자.(아마도 프로젝트 탭에 "LabelTextControl"이 나와 있을 것이다.) 선택 후 확인 하자.
13. 실행 후 확인
댓글 없음:
댓글 쓰기