m.cafe.daum.net/smbitpro/R7EG/8
Form 이벤트
이번에는 Form의 이벤트중에서 키 관련 이벤트들에 대해 살펴보기로 하자.
Form의 이벤트 핸들러는 첫번째 파라미터로는 이벤트가 발생한 원인을 제공한 object가 넘어가고 두 번째 인자로는 해당 이벤트 처리에 일반적으로 필요한 요소로 구성된 이벤트 파라미터가 넘어간다.
여러분들이 알고 있듯이 이벤트 핸들러 설정은 += 을 통해 할 수 있다. 이에 대한 사항을 모르고 있다면 C# 언어에 관련된 레퍼런스에서 delegate와 event관련 파트를 먼저 살펴보는 것이 장기적인 관점에서 좋을 것이다.
//이벤트 핸들러를 설정하는 코드
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyUp);
//KeyUp 이벤트 핸들러
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
}
Visual Studio 2008에서는 인텔리센스 기능으로 [이벤트 명]+=를 치고 Tab을 두 번 누르면 이에 해당하는 이벤트 핸들러가 자동 추가된다.
혹은, 속성 창에서 이벤트(번개 표시)를 누르고 원하는 이벤트에 더블 클릭을 할 경우에도 이벤트 핸들러를 설정하는 코드와 이에 해당하는 이벤트 핸들러 코드를 자동으로 작성해 준다. 이벤트 핸들러 설정하는 코드는 [폼].Designer.cs 소스 파일에 이벤트 핸들러 코드는 [폼].cs 파일에 생성된다.
폼의 이벤트를 처리하는 또 다른 방법은 [On메시지명]에 해당하는 메서드를 override를 하여도 동일한 효과를 얻을 수 있다.
//KeyUp을 처리하는 [안내]태그제한으로등록되지않습니다-xxOnKeyUp메서드
protected override void [안내]태그제한으로등록되지않습니다-xxOnKeyUp(KeyEventArgs e)
{
base.[안내]태그제한으로등록되지않습니다-xxOnKeyUp(e);
}
키 이벤트
이벤트명 |
이벤트 파라미터 |
설명 |
KeyDown |
KeyEventArgs |
포커스 소유 상태에서 키를 누르면 발생 Control에서 상속 |
KeyPress |
KeyPressEventArgs |
포커스 소유 상태에서 키를 누르면 발생 Control에서 상속 |
KeyUp |
KeyEventArgs |
포커스 소유 상태에서 키를 눌렀다 떼면 발생 Control에서 상속 |
PreviewKeyDown |
PreviewKeyDownEventArgs |
포커스 소유 상태에서 키를 누르면 발생 Control에서 상속 |
키 관련 이벤트는 PreviewKeyDown => KeyDown => KeyPress => KeyUp 순으로 발생한다.
이를 확인해 보기로 하자.
키에 관련된 이벤트가 발생할 때마다 이벤트 발생 카운터를 증가시키고 각 이벤트 핸들러에서는 각기 다른 label컨트롤에 카운터 값을 대입하는 형태의 응용을 만들면 이를 확인할 수 있을 것이다.
Windows Forms 응용 프로그램 프로젝트를 생성하여 label 컨트롤을 4개 추가하자. 그리고, Form1의 KeyDown, KeyPress, KeyUp, PreviewKeyDown 이벤트 핸들러를 추가하자. Form1에 이벤트 발생 카운터를 위한 멤버 필드 ecnt를 선언하자. 그리고, 각 이벤트 핸들러에서는 ecnt를 1증가한 후 각기 다른 label컨트롤에 Text 속성을 ecnt.ToString()으로 대입하자.
int ecnt;
private void Form1_KeyDown(object sender, KeyEventArgs e) { ecnt++; label1.Text = ecnt.ToString(); }
private void Form1_KeyPress(object sender, KeyPressEventArgs e) { ecnt++; label2.Text = ecnt.ToString(); }
private void Form1_KeyUp(object sender, KeyEventArgs e) { ecnt++; label3.Text = ecnt.ToString(); }
private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { ecnt++; label4.Text = ecnt.ToString(); } |
다음은 이를 실행한 후 키를 한 번 눌렀다가 떼었을 때의 모습이다.
1. KeyEventArgs의 public 속성들
KeyEventArgs는 KeyUp이나 KeyDown이벤트 핸들러에 넘어오는 인자이다.
다음은 KeyEventArgs의 public 멤버 속성들이다.
속성 명 |
형식 |
설명 |
Alt |
bool |
Alt 키를 눌렀는지 여부 |
Control |
bool |
Ctrl키를 눌렀는지 여부 |
Handled |
bool |
이벤트가 처리되었는지 여부 |
KeyCode |
Keys |
키보드 코드 |
KeyData |
Keys |
키 데이터 |
KeyValue |
int |
키보드 값 |
Modifiers |
Keys |
보조키 플래그 |
Shift |
bool |
Shift키를 눌렀는지 여부 |
SuppressKeyPress |
bool |
키 이벤트를 내부 컨트롤에 전달할지 여부 |
KeyEventArgs의 public 멤버 속성들 중에 KeyCode와 KeyData, Modifiers는 형식이 모두 Keys이다. KeyCode는 최종적으로 누른 키이고 Modifiers는 Alt키, Ct기키, Shift키가 누른 상태일 때 이에 대한 키이고 KeyData는 KeyCode와 Modifiers의 합이다.
다음은 Shitf키와 A를 눌렀을 때의 KeyCode, KeyData, Modifiers 값들이다.
예를 들어 Shift + A를 눌렀을 때 메시지 창을 띄우고자 한다면 다음과 같은 코드가 필요할 것이다.
if(e.KeyData ==(Keys.Shift | Keys.A))
{
MessageBox.Show("확인");
}
이를 다음과 같이 표현할 수도 있을 것이다.
if ((e.KeyCode == Keys.A) && (e.Modifiers == Keys.Shift))
{
MessageBox.Show("확인");
}
2. KeyPressEventArgs의 public 속성들
KeyPressEventArgs는 KeyPress이벤트 핸들러에 넘어오는 인자이다.
TextBox와 같은 컨트롤에서 기능 키를 누르는 것은 큰 의미가 없을 것이다. 이러한 경우에 처리하기 용이하도록 발생하는 이벤트이다. 이로 인해 기능 키와 일부 키를 눌렀을 경우에는 KeyDown이벤트는 발생하지만 KeyPress이벤트는 발생하지 않는다.
다음은 KeyPressEventArgs의 public 멤버 속성들이다.
속성 명 |
형식 |
설명 |
Handled |
bool |
이벤트가 처리되었는지 여부 |
KeyChar |
char |
누른 키에 해당하는 문자 |
2. PreviewKeyDownEventArgs의 public 속성들
PreviewKeyDownEventArgs는 PreviewKeyDown이벤트 핸들러에 넘어오는 인자이다.
다음은 PreviewKeyDownEventArgs의 public 멤버 속성들이다.
속성 명 |
형식 |
설명 |
Alt |
bool |
Alt 키를 눌렀는지 여부 |
Control |
bool |
Ctrl키를 눌렀는지 여부 |
IsInputKey |
bool |
키가 일반 키인지 여부 |
KeyCode |
Keys |
키보드 코드 |
KeyData |
Keys |
키 데이터 |
KeyValue |
int |
키보드 값 |
Modifiers |
Keys |
보조키 플래그 |
Shift |
bool |
Shift키를 눌렀는지 여부 |
대부분의 멤버는 KeyEventArgs의 멤버와 동일하며 IsInputKey만이 차이가 있음을 알 수가 있다. IsInputKey는 일반 키 여부에 관한 속성인데 필터링 하기 위한 목적으로 사용이 된다.
'개발언어 > C#' 카테고리의 다른 글
[C#] (강의) 4. 컨트롤 개요 (폼 배치) (0) | 2021.04.12 |
---|---|
[C#] (강의) 3. Form 이벤트 (마우스/작업) (0) | 2021.04.12 |
[C#] (강의) 2. Form 속성(모양/포커스/액세스 가능성) (0) | 2021.04.12 |
[C#] (강의) 2. Form 속성(레이아웃) (0) | 2021.04.12 |
[C#] (강의) 2. Form 속성(창 스타일) (0) | 2021.04.12 |