Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[Programming/C#] WinForm : 이벤트와 이벤트 처리기 연결 본문

Programming/C#

[Programming/C#] WinForm : 이벤트와 이벤트 처리기 연결

scii 2020. 10. 2. 19:57

Form 클래스는 운영체제가 보내는 메시지 중 일부에 대해 이벤트를 구현하고 있다. 가령 사용자가 Form의 인스턴스, 즉 윈도우 위에서 마우스의 왼쪽 버튼을 누르면 WM_LBUTTONDOWN 메시지가 Form 객체로 전달되고, Form 객체는 이에 대해 MouseDown 이벤트를 발생시킨다.

Form과 WinForm의 윈도우와 컨트롤 클래스들이 윈도우 메시지를 포장하여 이벤트로 구현해 놓았다. 개발자는 그저 미리 정의되어 있는 이벤트에 이벤트 처리기 메소드를 선언하여 등록해주기만 하면 된다.

// 이벤트 처리기 메소드를 선언하고 Form 클래스의 MouseDown 이벤트 등록

class MyForm : Form
{
    // 이벤트 처리기 선언
    private void FormMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        MessageBox.Show("Hello, World!");
    }
    
    public MyForm()
    {
        // 이벤트 처리기를 이벤트에 연결
        this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.FormMouseDown);
    }
}

Form 클래스에는 MouseDown 외에도 무수히 많은 이벤트가 선언되어 있다. 이것들을 모두 배울필요는 없다. 왜냐하면 이벤트 처리기를 등록하고 이를 호출하는 메커니즘은 모든 폼과 컨트롤이 모두 똑같기 때문이다.
MouseDown 이벤트를 잘 이해하면 나머지 이벤트들도 똑같이 활용할 수 있다.

public event MouseEventHandler MouseDown;

위 코드에서 MouseEventHandler는 대리자이다 (이벤트는 대리자를 기반으로 선언된다). 그리고 이 대리자는 다음과 같이 선언되어 있다.

public delegate void MouseEventHandler(object sender, MouseEventArgs e);

위 선언 코드를 보면 이벤트 처리기가 어떤 매개 변수를 가져야 하는지 그리고 어떤 형식을 반환해야 하는지 알 수 있다.
반환 형식이 void이므로 이벤트 처리기는 아무 값도 반환할 필요가 없다. 그리고 두 개의 매개 변수를 받아들이며, 첫 번째 매개 변수는 object 형식이다. 
sender는 이벤트가 발생한 객체를 가리키는데, 현재 Form 클래스의 이벤트 처리기에 대해 알아보고 있으니 sender는 Form 객체 자신이다. 만약 Button 클래스의 이벤트 처리기였다면 Button 객체다. 
두 번째 매개 변수는 MouseEventArgs 형식이다. 다음과 같은 프로퍼티들을 제공함으로써 마우스 이벤트의 상제 정보를 제공한다.

프로퍼티 설명
Button 마우스의 어떤 버튼(왼쪽, 오른쪽 또는 가운데)에서 이벤트가 발생했는지를 나타낸다.
Clicks 마우스의 버튼을 클릭한 횟수를 나타낸다. 사용자가 더블 클릭했을 때만 어떤 기능을 수행하고 싶다면 이 값이 2일 경우를 확인하면 된다.
Delta 마우스 휠의 회전 방향과 회전한 거리를 나타낸다.
X 마우스 이벤트가 발생한 폼 또는 컨트롤 상의 x(가로) 좌표를 나타낸다.
Y 마우스 이벤트가 발생한 폼 또는 컨트롤 상의 y(세로) 좌표를 나타낸다.

폼 위에서 마우스를 누를 때마다 이벤트를 발생시키는 예제

using System;
using System.Windows.Forms;

namespace SimpleWindow
{
    internal class MainApp : Form
    {
        public void MyMouseHandler(object sender, MouseEventArgs e)
        {
            Console.WriteLine($"Sender: {((Form)sender).Text}");
            Console.WriteLine($"X: {e.X}, Y: {e.Y}");
            Console.WriteLine($"Button: {e.Button}, Clicks: {e.Clicks}");
            Console.WriteLine();
        }

        public MainApp(string title)
        {
            this.Text = title;
            this.MouseDown += new MouseEventHandler(MyMouseHandler);
        }
        static int Main(string[] args)
        {
            Application.Run(new MainApp("Mouse Event Test"));

            return 0;
        }
    }
}


/* 결과

Sender: Mouse Event Test
X: 77, Y: 47
Button: Left, Clicks: 1

Sender: Mouse Event Test
X: 77, Y: 47
Button: Left, Clicks: 2

Sender: Mouse Event Test
X: 156, Y: 102
Button: Right, Clicks: 1

Sender: Mouse Event Test
X: 90, Y: 193
Button: Middle, Clicks: 1

*/
Comments