MouseEnter, MouseLeave, MouseHover
Form에서, MouseEventArgs를 인자로 가지는, 기본적인 마우스 관련 이벤트는 MouseDown, MouseUp, MouseMove, MouseWheel이다. MFC에서, 마우스 커서가 언제 윈도우 영역을 벗어나는지 확인하기 위해 WM_MOUSELEAVE 메세지를 처리해봤던 사람이라면, Form에서도 이것과 비슷하게 Enter, Leave 처리가 이루어진다는 것을 알 수 있을 것이다. 즉, MFC에서 WM_MOUSELEAVE 메세지를 잡기 위해서는 TrackMouseEvent라는 구조체를 정의하고 여기에 이벤트를 받도록 정의해야 하는데, 그래서 기본적으로 WM_MOUSELEAVE 메세지는 CWnd 클래스의 속성에 나타나지 않는다. 마찬가지로, MouseLeave 이벤트는 MouseEventAr..
더보기
KeyDown, KeyUp, KeyPress
KeyEvnetHandler의 인자인 KeyEventArgs와, 키가 눌려졌을 때 발생하는 이벤트인 KeyPressEventHandler의 인자인 KeyPressEventArgs는, 중복되는 것 같다. 하지만, 실제로는 그렇지 않다. 당장, 폼 하나를 생성하고 KeyDown, KeyPress 이벤트를 재정의해서 확인해보라. KeyDown, KeyUp 이벤트에서의 KeyEventArgs의 KeyCode, KeyData, KeyValue는 언뜻 생각하면 현재 눌려진 키의 키값을 생성한다고 생각되겠지만, 사실 그렇지 않다. 키보드에서 어떤 키가 눌려졌다면, 그 값의 Virtual Key 값을 의미하는 것이다. 즉, 키보드에서 Caps Lock이 켜져 있든 그렇지 않든, d를 눌렀다면 KeyCode, KeyDa..
더보기
ref, out 키워드
C#에서는 모든 타입은 값 타입 아니면 참조 타입이다. 특히, 클래스는 언제나 참조 타입이다. 그런데, 이렇게 된다면 문제가 생기는데, 리턴값은 하나만 정의할 수 있기 때문에 여러개의 값을 돌려주고 싶을 경우에는 곤란한 상황이 발생한다. 이것을 해결하기 위해, 시그내처에 ref 키워드를 붙여주면, 해당 파라미터들은 값이 아니라 참조로서 메서드로 넘겨지게 된다. 그렇다면 out 인자는? out으로 선언된 파라미터들은, ref와 비슷하지만, 사용되기 전에 초기화된다는 점이 다르다. ref로 선언된 파라미터들은 실제로 어떤 값이 들어있는지 신경쓰지 않지만, out으로 선언된 파라미터들은, 오로지 값을 담아서 내보내는 것만이 목적일 때 유용하게 사용된다. 이런 목적의 파라미터들을 매서드 내부에서 초기화해주는 것..
더보기
C#에서의 static 키워드
C#에서의 static 키워드가 의미하는 바는, C/C++과 중요한 차이점이 있다. static이란 키워드는, C#이나 C/C++이나 저장 형태를 의미하는 것은 동일하며, 프로그램이 생성될 때 단 한번만 생성된다는 점은 동일하다. C/C++의 클래스, 데이터멤버, 메서드 등에 static이 쓰였다면 이것은 클래스가 인스턴스화 되기 전이나, 되고 난 다음 언제라도 이 멤버들에 접근할 수 있지만, C#에서 static으로 선언된 메서드나 필드들은, 반드시 인스턴스가 아닌, 클래스 자체에 접근해서 호출해야 한다. C#에서 Dummy라는 클래스가 선언되었다고 하자. 그리고, Dummy 클래스에서 static으로 StaticMethod()라는 메서드가 선언되었다면, 다음과 같은 호출은 허용되지 않으며, 클래스 자..
더보기
struct, class in C#
C#에서 구조체와 클래스는 의미가 조금 다르다. C++에서 클래스와 구조체는 근본적으로 차이가 없다. 다만, C++에서는 관습적으로 구조체는 액세스 지정자가 public이며, 클래스는 private라는 점만이 다를 뿐, 두 데이터형은 동일하다. 하지만, C#에서는 이 둘은 차이가 있다. 즉, 근본적으로 어떤 타입의 데이터이냐의 문제인데, 스택과 힙 영역 어디에나 데이터를 생성할 수 있는 C/C++과 달리, C#에서 클래스는 항상 힙 영역에 생성된다. 하지만, 구조체는 항상 스택에만 생성되는 것은 아니다. 구조체 역시 힙에 생성할 수 있다. 예를 들어, 구조체 Dummy가 선언되었다고 했을 때 Dummy dummy = new Dummy();라는 문장은, 암묵적으로 디폴트 생성자를 사용하여 힙에 Dummy를..
더보기