[C# 강좌 36장] WIndow Form - 3 구동원리

공부/C#  2012.10.15 09:00



안녕하세요. 명월입니다.

이번 포스팅에서는 winForm 에서 사용되는 메시지 이벤트를 알아보도록 하겠습니다.

예전 C, C++를 공부해 보신 분은 알겠지만 흔히 winForm은 메시지 구동 시스템이라고 합니다.즉 메시지가 무한 콜백을 이루면서 윈도우 폼이 떠오르는 것입니다. (자바는 솔직히 정확히 기억이 나질 않네요.. ㅠㅠ) 예전 C,C++에서는 이런 모든 항목을 코딩을 하고 선언을 해야 윈도우가 만들어졌으나 C#에서는 이 부분을 모두 Form라는 클래스 만들어졌습니다. 그러니깐 Form 함수를 상속하면 이 모든게 자동으로 생성이 되고 만질 게 없어지는 것이지요.

 

하지만 그 중 자주 사용되던 메시지는 이벤트로 빠졌습니다.  WM_INITDIALOG ,  WM_CLOSE, WM_PAINT 메시지 부분이 그 예가 되겠습니다. (C, C++ 모르는 분은 아 그런게 있구나 하고 넘어가셔도 무방합니다.)

 

그러니깐 폼이 하나 생성 되기까지는 작동되는 이벤트 폼이 그려지고 또 사라질때까지 그려지는 이벤트가 있는 것 입니다.

역시 설명보다는 예가 이해가 빠르겠습니다.

 

 

위 부분은 폼이 생성되서 소멸될때까지의 이벤트를 등록시킨 화면입니다.

 

 

각 이벤트에 발생 되면 Console 출력을 해 놓도록 해놨습니다.

 

 

 

폼이 생성되고 사라질 떄까지 나타나는 이벤트를 나열했습니다. 위 순서는 별 것 아니라고 생각할 수 있으면서도 매우 중요한 것입니다.굳히 이벤트를 저렇게 세분화해서 나눈 이유가 있습니다.

생성자는 Form 이 화면 상에 생성되기 전부터 구동이 됩니다.

즉 생성자 안에 폼의 객체에 접근하는 코드를 사용하면 에러가 날 수 있습니다. 그에 비해 Load 는 폼이 생성된 후에 실행 되기때문에 보통 생성자 안에는 객체 초기화, Load 이벤트에는 초기 값을 넣는 경우가 많습니다.

여기서 Load 와 Activated의 차이는 둘 다 폼이 생성 된 후에 실행되는 함수 인데 Activated는 C++ 에서 OnPaint 메시지와 같이 최소화 되었다가 나타나도 실행되고 화면이 새롭게 그려질 떄마다 호출되는 이벤트입니다.

 

그리고 FormClosing 이벤트와 FormClosed 이벤트의 차이는 Closing는 폼이 닫기 전에 실행 되는 것이고 Closed 는 폼이 닫힌 후에 실행되는 이벤트입니다. 역시 Closing 에서는 Form에 따라 파생된 메시지 루프들, 즉 스레드를 정리하는 이벤트이고 Closed 는 객체들의 반환식을 넣는 이벤트라고 할 수 있습니다.

 

마지막으로 Disposed 는 객체의 모든 메모리값이 반환되고 최종으로 호출되는 이벤트로써 다른 객체에 폼이 닫혔다는 것을 알리거나 Callback 값을 날릴 떄 사용됩니다.

 

 

위에서 보시는 것과 같이 이벤트를 직접 override 해서 재정의를 해도 가능합니다.

그리고 마지막에 보이는 WndProc 가 있는데 c언어와 같이 직접 메시지 처리도 가능합니다.

그러나 C#에서는 메시지 식별 번호를 따로 정의 해 놓지 않았기 때문에 이 부분은 과거 C, C++에 익숙한 사용자만 사용이 가능 할 듯 싶습니다.

 

여기까지 폼의 구동 원리에 대해서 알아보았습니다. 다음 포스팅에서는 필수 구조체에 대해 알아보도록 하겠습니다.

 


댓글 2개가 달렸습니다.
댓글쓰기
  1. 개발학습자
    2016.12.14 15:29 신고 |  수정/삭제  댓글쓰기

    안녕하세요. 너무나 감사하게도 덕분에 많은 강좌에 대해서 깊이 있게 공부를 하고 있습니다.

    궁금한점이 있어 이렇게 질문드리네요. 읽으실지 모르겠으나 혹시 모를 마음에 이렇게 질문 드립니다.

    과거 C,C++에서처럼 메시지큐에 WM_PAINT, WM_CLOSE 메시지가 메시지큐에 들어오게되면 자동으로 호출되던 OnDraw()라던지 이런부분들이 있었는데,

    그렇다면 메시지 큐에 WM_PAINT 메시지가 메시지큐에 들어가게되면 Paint 이벤트가 발생하게 되는것인가요???

  2. C#으로 먹고사는 남자
    2017.08.11 10:31 신고 |  수정/삭제  댓글쓰기

    원리가 항상 궁금 했는데 명쾌하게 잘 설명해주셔서 너무 감사합니다.