본문 바로가기
개발언어/C#

[C#] (강의) 3. Form 이벤트 (키)

by 창용이랑 2021. 4. 12.
728x90

m.cafe.daum.net/smbitpro/R7EG/8

 

3. Form 이벤트 (키)

Form 이벤트 이번에는 Form의 이벤트중에서 키 관련 이벤트들에 대해 살펴보기로 하자. Form의 이벤트 핸들러는 첫번째 파라미터로는 이벤트가 발생한 원인을 제공한 object가 넘어가고 두 번째 인자

m.cafe.daum.net

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는 일반 키 여부에 관한 속성인데 필터링 하기 위한 목적으로 사용이 된다.