Win32 API 헬프에서 보면, MDI 차일드 윈도우가 파괴될 때 MDI 클라이언트 윈도우(메인의 MDI 영역)로 WM_MDIDESTROY 메시지가 보내진다고 써있습니다. 만약 그대로라면, 메인의 ClientHandle의 윈도우 프로시저를 바꿔치우고 WM_MDIDESTROY 메시지가 들어오는지 검사하면 되는데요.
http://msdn.microsoft.com/en-us/library/ms644914(VS.85).aspx
실제로는 안됩니다. 거짓말입니다. WM_MDIDESTROY와 반대인 WM_MDICREATE의 경우 MDI 클라이언트 윈도우로 메시지가 들어와서 검출이 되는데, WM_MDIDESTROY는 메인의 MDI 클라이언트 윈도우로 들어오는 것이 아니라 MDI 차일드 윈도우로 들어옵니다. 생각해보면, 그게 논리적이기도 합니다. (왜 아직도 이 MS 문서들이 업데이트가 안되고 있는지 모르겠습니다)
그래서, 직접 검출해야 합니다. 쉽게 생각할 수 있는 방법은, MDI 차일드 폼의 OnClose 등의 이벤트에서 메인쪽으로 직접 사용자 정의 메시지를 날려주는 겁니다. (메인의 함수를 실행하거나.. 이런 방법은 곤란합니다. MDI 차일드쪽에서 메인폼 클래스를 알아야 하기 때문에, dll에서 메인 유닛을 참조하게 되는 문제가 생깁니다)
물론 이런 방법을 쓰면, dll의 경우 모든 MDI 차일드 dll마다 일일이 이런 코드를 다 추가해줘야 합니다. 그래도 해주면 되긴 됩니다.
하지만 역시 꽤 번거롭기 때문에, 그래서 저는 dll이 아닌 bpl을 씁니다. dll은 C 인터페이스여서 클래스 액세스가 여러가지로 곤란하지만, bpl의 경우 C++ 인터페이스이기 때문에 다른 bpl의 클래스로부터 상속도 가능합니다. 따라서 공통 bpl을 만들고 여기에서 공통 MDI 차일드 클래스를 만들고 위의 코드를 추가한 다음, 실제 MDI 차일드 화면 파일들은 모두 여기에서 상속받도록 만듭니다. 이외에도 업무 개발 화면을 MDI 차일드로 만들게 되면 여러 공통 코드들이 생기는데 역시 마찬가지로 공통 클래스에 집어넣고 상속받으면 아주 깔끔해집니다. 더욱이 모든 MDI 차일드들이 공통 클래스로부터 상속받았기 때문에, 공통 클래스에 필요한 공통 함수나 이벤트, 속성을 추가하고 차일드폼들끼리의 독립성을 최대한 유지하면서도 서로 액세스할 수 있습니다.
그럼...
쏘가리 님이 쓰신 글 :
: MDI 메인폼 Child 폼을 dll로 만들었습니다. 그런데 메인폼에서 child 폼이 종료된걸 알고
: 싶은데 어렵네요. 방법이 없을까요
|