[MFC] – 다이얼로그 기반 프로그램에서 실행과 동시에 다이얼로그 감추기

[출처] – http://frog3147.tistory.com/entry/다이얼로그-기반-프로그램에서-실행과-동시에-다이얼로그-감추기

다이얼로그를 domodal로 띄울 때 실행과 동시에 다이얼로그를 트레이로 내리거나 감추어야 할 경우 일반적으로 사용하는 방법으로 윈도우를 보이지 않게 하려면

ShowWindow(FALSE);

와 같이 하면 되지만  다이얼로그 기반의 프로그램에서는 DoModal 함수가 내부적으로 WM_SHOWWINDOW 메시지를 사용하여 윈도우를 띄워버리기 때문에 OnInitalDialog나 OnCreate 처리기에서 인위적으로

ShowWindow(SW_HIDE);

라고 코딩을 해놓아도 해당 작업이 무시되어 버린다.
이러한 문제가 발생하는 이유는 DoModal 함수가 내부적으로 메시지 루프를 형성하기 직전에 SendMessage를 이용하여 대화상자를 출력시키는 방법을 사용하기 때문이다. SendMessage를 보낸 쪽은 받는 쪽의 처리기가 작업을 완료할 때까지 다른 작업을 수행하지 않는다는 것은 알고 있을 것이다. 따라서 OnInitalDialog, OnCreate함수 내에서 윈도우를 보이지 않게 하는 코드를 추가한다고 하여도 대화상자는 출력된다.
이럴 경우에는 PostMessage를 사용하여 해결이 가능하다.
PostMessage는 SendMessage와는 다르게 사용자가 지정한 메시지를 메시지 대기열에 넣어놓기만하고 계속 작업을 수행하게 된다. 따라서 대기열에 넣어둔 메시지가 실행되려면 최소한 메시지를 받는 윈도우가 메시지 루프를 형성한 후가 되고 위와 같은 상황에서는 자신이 자신에게 메시지를 전달하는 방식이므로 다이얼로그가 메시지 루프를 형성하기 전에는 PostMessage에 의해 메시지 대기열에 들어가있는 메시지는 수행되지 않는다.
DoModal함수가 메시지 루프를 형성하기 전에 WM_SHOWWINDOW 메시지를 이용하여 다이얼로그를 출력시키더라도 메시지 루프가 형성되고나면 메시지 대기열에 들어가있던 메시지에 의해 다이얼로그를 감출 수가 있다.

OnInitalDialog함수의 맨 아래쪽에 다음과 같은 코드를 넣어주면 실행과 동시에 다이얼로그가 숨겨진다.

PostMessage (WM_SHOWWINDOW,FALSE, SW_OTHERUNZOOM);