[C#] 가계부 만들기 - 메시지 전문 만들기

프로젝트/가계부(1)  2013.02.15 09:00

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


이번 포스팅에서는 메시지 전문을 작성해 보도록 하겠습니다.


메시지 전문이라고 하면 정확히는 C#에는 없어진 기능 중에 하나 입니다. 즉 핸들을 취득하여 해당 윈도우 핸들에 메시지를 전달하여 통신하는 방식이 없어진 것입니다.
정확한 이유는 모르겠으나 추측으론 아마 SendMessage 나 PostMessage 로 강제적으로 메시지를 전송하면 전체적인 프로글매 균형(?)이 저하된다고 판단 되어서 그런 것 같습니다.


그것이 아니면 객체지향의 특성인 클래스를 더욱 강화하기 위해서 일 수 도 있습니다.


C#에서는 굳히 핸들를 취득하여 메시지를 보내는 것이 아니라 클래스 포인터를 인스턴스 화 시켜서 접근하는 방법이 있습니다. 이래저래 방법론이야 많지만 아직 저에겐 C++ 디자인 패턴이 익숙하고 접근하기 쉽기 때문에 메시지 전문 형식으로 작성해 보겠습니다.


먼저 제가 왜 이 메시지 전문을 택한 이유에 대해서 설명 하겠습니다.



보시다 싶이 이 프로그램의 기본 패널에는 두개의 컨트롤로 두개로 나뉘어져 있습니다.
메인 뷰 패널과 입력 패널로 나뉘어져 있습니다.
패널과 패널이 접근을 할 수 있는 방법에 대해 생각해 보겠습니다.


예로 먼저 입력이 일어나게 되면 입력 패널에서 등록 이벤트가 발생하고 메인 뷰 패널로 값이 전달되어야 하겠습니다.


먼저 전형적인 C# 방식으로 하면
Parent 객체를 이용하여 메인 폼에 접근 하고 거기에 함수를 실행 시켜서 자식 컨트롤 메인 뷰에 접근하여야 겠습니다.





등록 이벤트 -> 메인폼 함수 -> 메인뷰 이런식으로 날라갔습니다.



이 가계부는 간단한 프로그램이라 거치는 것이 세곳입니다.
만약 컨트롤 -> 컨트롤 -> 컨트롤 -> ....
이라고 하면 메시지 하나 보내기 위해 모든 컨트롤에 함수를 작성해야 합니다... 엄청난 비효율입니다.


두번째는 인스턴스 함수에 각 클래스 포인터를 저장해 놓는 방법입니다. C#에서는 이 방법이 가장 효율적이고 객체지향 적인 모습입니다.


(예제를 작성하려고 했는데 너무 복잡해져서 못했습니다.)
이것또한 힘든 점이 있다면 클래스 포인트를 저장해 놓는 클래스는 모든 클래스를 참조해야 한다는 단점이 발생하네요.. 역시 손이 많이 가는 작업입니다.


세번째는 생성자에 부모 클래스를 내려 받는 방법입니다.
이 방법인 가장 안좋은 방법입니다. 생성자 구조도 복잡해 지고 결합도가 높아지기 때문에 후에 사양을 바꿀 때 수정하기 에로 사항이 많기 때문입니다.


그럼 이 복잡한 방법 말고 간단하게 제가 사용하는 메시지 방법을 설명하겠습니다.



C API 중 하나인 PostMessage 와 핸들만 가지고 있으면 통신이 가능하겠습니다.
(SendMessage는 C#에서 LRESULT 형식이 없어진 관계로 사용해도 의미가 없어졌습니다.
혹시 방법이 있으면 알려주세요.. 저는 도저히 모르겠어요....)




두 이미지는 각 클래스의 핸들을 static에 저장하는 모습입니다. 그럼 메시지를 보내보도록 해보겠습니다.



받는 곳은 윈도우 메시지인 WinProc 를 오버라이딩 해서 받습니다.



결과화면입니다.



훨씬 간단하게 전송이 되었습니다.


이제는 단순하게 클릭 되었다는 이벤트 식이 아닌 파라미터에 전문을 실어서 보내보도록 하겠습니다.


wParam 은 전문의 길이, lParam은 실제 전문을 전송하는 형식의 함수를 생성하였습니다.






결과 화면입니다. 전송이 아주 간단하게 값이 전달 되었습니다.


이걸로 입력, 수정, 삭제, 캔슬 이벤트 전문을 작성해 보겠습니다.


MW_WINAPI.cs


댓글 4개가 달렸습니다.
댓글쓰기
  1. sayheart
    2013.04.21 22:45 신고 |  수정/삭제  댓글쓰기

    http://www.hanb.co.kr/network/view.html?bi_id=333
    원본 출처

  2. sayheart
    2013.05.11 13:04 신고 |  수정/삭제  댓글쓰기

    링크를 잘못 적었나보네요. ㅇ_ㅇ;;
    어떤분이 올린 소스에 원본 링크가 저기였어요.