티스토리 뷰

728x90

지금까지 VB.Net과 관련한 예제 프로그램을 조금씩 만들어보면서 조금씩 익숙해 지는 점은 프로그램 시작-처리-종료로 이어지는 순차적이고 구조적인 프로그래밍이 아니라, 창과 컨트롤과 같은 오브젝트를 만들고 각 오브젝트와 관련한 속성을 설정하고, 관련 메소드를 호출하거나 이벤트 처리 루틴을 작성하는 과정으로 이루어져 있음을 깨닫게 될 것입니다. 이런 과정을 두고 OOP(Object-Oriented Programming), 객체 지향 프로그래밍이라 부릅니다. 개발자가 가장 많이 접하는 이벤트는 뭐니 뭐니해도 클릭 또는 더블클릭 이벤트일텐데 버튼에 대한 클릭이벤트의 경우에는 마우스가 아닌 엔터키나 ESC키를 눌렀을 때에도 클릭이벤트로 전달되기도 하며 버튼에 포커스가 있을 경우에는 [Space]키로도 클릭이벤트를 전달할 수 있습니다. 본 포스팅에서는 개발자들이 가장 많이 활용하는 마우스와 키보드 이벤트 처리에 대하여 자세히 살펴 볼까 합니다.


■ 마우스 이벤트

마우스 이벤트는 폼이나 각 컨트롤의 영역을 기준으로 발생하며 아래의 코드처럼 이벤트 처리 루틴으로 넘겨지는 이벤트 아규먼트의 타입이 클릭 이벤트의 경우에는 EventArgs이지만 마우스 이벤트들은 MouseEventArgs 타입으로 넘겨집니다. 이미 아시겠지만 다시 한번 확인하면 이벤트 처리 루틴은 하나의 오브젝트에 대해서만 작성하는 것이 아니라 동작이 같다면 하나의 이벤트 처리 루틴으로 여러 오브젝트의 이벤트를 다룰수 있습니다. 이벤트 처리 루틴의 Handles 키워드 다음에 여러 오브젝트를 콤마로 구분해서 리스팅할 수 있습니다. 여러 오브젝트의 이벤트를 처리하는 경우 이벤트가 어떤 오브젝트로부터 왔는지는 sender 아규먼트를 통해서 확인할 수 있습니다.

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

    End Sub

    Private Sub TextBox1_MouseClick(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick

    End Sub


마우스 연관 이벤트라고 모든 이벤트가  MouseEventArgs 타입으로 정보가 전달되는 것은 아닙니다. MouseClick, MouseDoubleClick, MouseUp, MouseDown, MouseMove, MouseWheel 등의 이벤트는 MouseEventArgs 타입으로 아규먼트가 넘어오지만 MouseHover, MouseCaptureChanged, MouseEnter, MouseLeave등의 이벤트는 단회성으로  EventArgs타입으로 전달되기 때문에 마우스 버튼의 종류나 위치와 같은 정보가 전달되지는 않습니다. 마우스 이벤트의 아규먼트로 전달되는  MouseEventArgs의 속성에는 아래와 같은 것들을 활용할 수 있습니다.

  • Button : 어떤 마우스 버튼이 눌러졌는지 표시. MouseButtons.Left, MouseButtons.Middle, MouseButtons.None, MouseButtons.Right
  • Clicks : 버튼이 몇번 클릭되었는지 표시
  • Delta : 마우스 휠의 회전수 표시
  • X, Y : 마우스의 위치
이벤트를 추가할 때는 아래의 그림처럼 코드 편집창 상단에서 좌측의 오브젝트와 우측의 이벤트를 선택하는 방식을 사용할 수도 있고

디자이너 창에서는 해당 오브젝트를 선택한 상태에서 속성창을 이벤트 형태로 바꾸어 원하는 이벤트를 추가할 수 있습니다.



아래의 예제 코드는 버튼 영역에 마우스가 진입하면 폼의 배경색을 오렌지색으로 바꾸고, 마우스가 버튼 영역에서 나오면 원래대로 복구하며, 폼 영역에서 마우스가 움직이면 그 위치를 텍스트 박스에 출력하는 코드입니다.
Public Class Form2
    Private tmpcolor As Color
    Private Sub Button1_MouseEnter(sender As Object, e As System.EventArgs) Handles Button1.MouseEnter
        tmpcolor = Me.BackColor
        Me.BackColor = Color.Orange
    End Sub

    Private Sub Button1_MouseLeave(sender As Object, e As System.EventArgs) Handles Button1.MouseLeave
        Me.BackColor = tmpcolor
    End Sub

    Private Sub Form2_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        TextBox1.Text = "마우스 위치 " & e.X & " - " & e.Y
    End Sub
End Class


■ 키보드 이벤트

키보드 이벤트는 키보드를 누를때, 뗄때 모두를 컨트롤하는 KeyDown, KeyUp 이벤트와 좀더 간편하게 이벤트를 다룰 수 있는 KeyPress 이벤트로 나눌 수 있습니다. 

KeyDown, KeyUp 이벤트의 경우에는 KeyEventArgs 타입으로 아규먼트를 전달하며 KeyEventArgs 의 속성에는 아래와 같은 것을 사용할 수 있습니다.

  • Alt, Control, Shift : 보조키가 눌러졌으면 True 표시합니다.
  • KeyCode, KeyData, KeyValue : 눌러진 키보드 코드 및 데이터
  • Modifiers : 보조키가 복합적으로 눌러진 경우 마스크로 표시


KeyPress 이벤트의 경우에는 KeyPressEventArgs 타입의 아규먼트를 전달하며 KeyChar 속성을 통해서 키보드 코드가 아닌 문자를 간편하게 받을 수 있습니다. 예를 들어 소문자 상태에서 Shift키를 누르면서 'a'를 누르면 KeyDown/KeyUp의 경우는 모두 'a'의 키보드 코드가 전달되면서 Shift속성 값이 달라지지만 KeyPress의 경우에는 문자 'A'가 KeyChar로 전달됩니다. 반면에 KeyDown/KeyUp에서 문자를 확인하려면 Chr(e.KeyCode)처럼 키보드 코드를 문자로 바꾸어 주어야 합니다.

KeyEventArgs 타입과 KeyPressEventArgs 타입 모두 Handled 라는 속성을 가지고 있으며 이 속성을 통해서 키보드 이벤트가 처리되었는지 여부를 확인하거나 조정할 수 있습니다. 처리 루틴에서 Handled를 True로 설정하면 VB에서는 이후로는 더이상 해당 이벤트를 처리하지 않습니다. 한가지 주의할 점은 IME가 동작하여 한글 상태에서의 키보드 이벤트는 예상과 다르게 동작할 수 있으므로 주의 해야 합니다. 또한, 키보드 이벤트는 키보드 포커스를 가지고 있는 컨트롤에 전달하므로 감안해서 작업해야 합니다.

아래의 코드는 텍스트 박스에서 숫자 입력 여부를 검사해서 다른 키는 Handled에 True를 설정해서 무시하는 예제입니다.

Private Sub TextBox1_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        If e.KeyChar < Chr(Keys.D0) Or e.KeyChar > Chr(Keys.D9) Then
            e.Handled = True
        End If
    End Sub


728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
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
글 보관함