12.7 일반적인 이벤트(GUI Event)
일반적인 C#에서 등장하는 GUI 이벤트 모델을 살펴보겠습니다. 이 이벤트 모델은 전체 Visual C#의 가장 일반적인 모델이며 정규화된 모델이기 때문에 여러분들은 이 모델 하나만을 숙지하시면 C# 전체의 이벤트 모델을 이해하셨다고 보셔도 좋습니다.
이 절에서는 윈도우 폼을 생성한 뒤 사용자가 폼을 클릭했을 때 폼의 클릭(Click)에 해당하는 이벤트의 처리과정을 알아보도록 하겠습니다.
1단계: GUI 이벤트를 테스트하기 위한 윈도우 폼 만들기
윈도우 이벤트 모델을 이해하기 전에 먼저 Form을 하나 만들고 그 폼을 화면상에 디스플레이하는 프로그램을 작성하도록 하겠습니다. GUI 이벤트 모델의 기본이 되는 프레임 하나 정도는 있어야겠죠. C#에서 Visual Tool을 이용하셔도 되지만 여기서는 직접 수작업으로 작성하도록 하겠습니다.
& |
EventFormTest.cs |
Ü 윈도우 폼 만들기 |
using System; | ||
C:\C#Example\12>csc EventFormTest.cs C:\C#Example\12>EventFormTest |
위와 같이 간단하게 윈도우 폼을 하나 생성했습니다.
2단계: 폼에 등록된 이벤트 찾기(Click)
화재, 도난과 교통사고 등의 이벤트가 존재하는 것처럼 윈도우 폼에도 미리 등록된 이벤트가 존재합니다. 이러한 이벤트는 여러분이 필요할 때 찾아서 사용하시면 됩니다.
그림 12-3 VS.NET IDE에서 보여지는 이벤트
비쥬얼 툴 내에서 소스 코드를 작성할 때 폼에 대한 참조값을 사용하면 위와 같은 드롭다운 정보를 자동으로 보여줍니다. 이 때 번개모양을 한 것이 바로 이벤트에 해당합니다. 즉, 미리 등록된 이 이벤트가 존재한다는 것입니다. 아래의 표는 Form에서 사용할 수 있는 이벤트들의 목록을 보여주고 있습니다.
Form에서 사용할 수 있는 이벤트들 |
Activated,
BackColorChanged, BackgroundImageChanged, BindingContextChanged,
CausesValidationChanged, ChangeUICues, Click, Closed, Closing,
ContextMenuChanged, ControlAdded, ControlRemoved, CursorChanged,
Deactivate, Disposed, DockChanged, DoubleClick, DragDrop, DragEnter,
DragLeave, DragOver, EnabledChanged, Enter, FontChanged,
ForeColorChanged, GiveFeedback, GotFocus, HandleCreated,
HandleDestroyed, HelpRequested, ImeModeChanged, InputLanguageChanged,
InputLanguageChanging, Invalidated, KeyDown, KeyPress, KeyUp, Layout,
Leave, Load, LocationChanged, LostFocus, MaximizedBoundsChanged,
MaximumSizeChanged, MdiChildActivate, MenuComplete, MenuStart,
MinimumSizeChanged, MouseDown, MouseEnter, MouseHover, MouseLeave,
MouseMove, MouseUp, MouseWheel, Move, Paint, ParentChanged,
QueryAccessibilityHelp, QueryContinueDrag, Resize, RightToLeftChanged,
SizeChanged, StyleChanged, SystemColorsChanged, TabIndexChanged,
TabStopChanged, TextChanged, Validated, Validating, VisibleChanged |
표 12-4 Form에 사용할 수 있는 이벤트들
이러한 이벤트들은 여러분이 폼을 띄웠을 때 작동하는 것도 있으며 작동하지 않는 것도 있습니다. 이 많은 이벤트들이 하나의 모델로 동작한다는 것은 아주 신기한 일입니다. 즉, 어떠한 이벤트가 등록되었는지를 확인하고 그 이벤트를 수신하는 측과 연결해 주는 것입니다. 이 중에서 우리는 Click 이벤트의 처리기를 만들어보도록 하겠습니다.
3단계: Click 이벤트 처리기(Event Handler) 만들기
Click 이벤트의 처리기를 만드는 방법은 일반적인 메서드를 만드는 방법과 같습니다. 하지만, 여기서 주의하셔야 하는 것이 바로 메서드의 매개변수입니다. 메서드를 만들 때의 형식은 다음과 같습니다.
이벤트 처리기(EventHandler)의 형태 |
private void ClickReceive(object sender, EventArgs e){ } |
표 12-5 이벤트 처리기(EventHandler)
매개변수 중 Object sender는 메시지가 어디서 발생하는지 발생된 곳의 참조값을 의미하며, EventArgs e는 이벤트의 데이터를 담고 있는 매개변수입니다. 이 두가지의 매개변수는 바꿀 수 없으며 항상 위와 같은 규칙으로 사용하셔야 합니다. 이벤트 처리기까지 포함한 소스는 다음과 같습니다.
& |
EventFormTest.cs |
Ü 윈도우 폼에서 이벤트 수신할 메서드 추가 |
using System; |
위의 예제에서는 이벤트 처리기만을 갖추었을 뿐 이벤트 처리기를 Click 이벤트에 등록해 주지 않았습니다. 다음으로 이벤트 처리기를 이벤트에 등록하는 부분을 추가하도록 하겠습니다.
4단계: Form의 Click 이벤트에 이벤트 처리기 등록하기
이벤트 처리기를 등록하기 위해서는 Delegate 형태로 만들어서 등록해야 합니다. 물론, 등록은 Click 이벤트에 해야하고, Click 이벤트에 등록할 때는 반드시 Delegate 형태로 만들어서 등록을 해야합니다. 이 때 사용되는 Delegate가 바로 EventHandler입니다. 앞에서 만든 이벤트 처리기를 EventHandler로 만든 후, EventHandler를 등록하게 됩니다.
그런데, 여러분이 앞에서 이벤트 처리기를 만들 때 왜 매개변수 2개를 맞추어 준 것일까요. 바로 EventHandler가 다음의 모양을 하고 있기 때문에 EventHandler 델리게이트와 메서드를 맞추어 주기 위해서입니다.
public delegate void EventHandler(object sender,EventArgs e);
다음은 EventHandler를 만들어서 Click 이벤트에 등록하는 완성된 예제입니다.
& |
EventFormTest.cs |
Ü 윈도우 폼에서 이벤트 수신할 메서드 추가 |
using System; | ||
C:\C#Example\12>csc EventFormTest.cs C:\C#Example\12>EventFormTest |
5단계: Click 이벤트 발생, 이벤트, 이벤트 처리
Click 이벤트가 발생되는 곳은 어디일까요? 클릭이벤트가 발생되는 곳은 바로 여러분이 Form을 클릭하는 순간입니다. 이번 예제의 이벤트는 Click이며, 이벤트 처리기는 ClickReceive() 메서드입니다. 그리고, 이벤트를 발생시키는 주체는 User가 되는 것입니다.
▣ Event의 처리 순서 |
1. User가 폼을 클릭한다.(Click 이벤트 발생) 2. 폼의 Click 이벤트에 연결된 이벤트 처리기를 찾는다.(등록된 EventHandler 검색) 3. 이벤트 처리기를 호출한다.(EventHandler 호출, 매개변수로 호출자와 이벤트의 정보를 주고 EventHandler를 호출한다) 4. EventHandler에 포함된 메서드를 호출하여 작업을 처리한다. |
[출처] [펌] 일반적인 이벤트(GUI Event)|작성자 눈꽃천사