반응형

BLOG main image






 닫기버튼(x닫기)이나 alt+F4 종료하게되면


WM_CLOSE 메세지가 프레임 윈도우에 발생한다


mainframe::OnClose() 함수가 먼저 호출됨










http://blog.naver.com/hoi_yeon/10020732860


WM_CLOSE

윈도우가 닫히기 전에 이 메세지가 전달되며 메인 윈도우인 경우는 응용 프로그램이 종료된다는 신호.

이 메세지를 처리하지 않고 DefWindowProc으로 보내면 DestroyWindow 함수를 호출하여 윈도우를 파괴하도록한다.

이 메제지가 전달되었을 때는 아직 윈도우가 파괴된 것이 아니므로 윈도우가 파괴되는 것을 중간에 차단할 수 있다. 미저장 파일이 있거나 프로그램을 종료할 상황이 되지 않을때 사용자에게 메세지 박스를 통해 종료 사실을 확인 시킬수 있으며 이 메세지를 가로채서 단순히  return하면 DestroyWindow가 호출되지 않도록 할 수 있다.

WM_DESTROY

윈도우가 파괴될 때 이 메세지가 전달된다. 사용자가 Alt+F4 또는 닫기버튼을 누를 경우 WM_CLOSE 메세지가 전달되며 이 메세지를 별도로 처리하지 않으면 DefWindowProcDestroyWindow함수를 호출하여 윈도우를 파괴한다. 또는 프로그램 코드 내부에서 명시적으로  DestroyWindow함수를 호출할 때도 윈도우가 파괴되는데 이 함수 호출결과로 WM_DESTROY 메세지가 전달된다.

이 메세지를 받은 윈도우의 종료를 위한 처리를 해야 하는데 예를 들어 열어놓은 파일을 닫고 할당한 메모리를 해제하는 등의 정리 작업을 한다. WM_CREATE에서의 초기화 처리의 반대 동작이 이 메세지에 작성되는것이 일반적이며 그 외 레지스트리에 미보관 정보를 저장하는 등의 작업을 할 수 있다. 만약 파괴되는 윈도우가 클립보드 체인에 속해 있으면 자신을 클립보드 체인에서 제거해야한다.

DestroyWindow 함수는 파괴할 윈도우를 화면에서 숨긴 후 이 메세지를 보내므로 이 메세지를 받은 시접에서는 윈도우 자체가 파괴되지 않은 상태이다. 또한 DestroyWindow 함수는 자식 윈도우에게도 이 메세지를 차례대로 보내주는데 부모 윈도우가 먼저 이 메세지를 받고 자식 윈도우에게로 이 메세지가 보내진다. 따라서 부모 우니도우가 이 메세지를 처리하는 동안은 모든 자식 윈도우가 아직 파괴되기 전이므로 자식 윈도우를 프로그래밍할 수 있다.

파괴되는 윈도우가 메인 윈도우일 경우 PostQuitMessage 함수르 ㄹ반드시 호출하여 프로세스의 메시지 루프를 종료하도록 해야 한다. 만약 이 처리를 생략하면 윈도우만 파괴되고 메세지 루프는 계속 실행중인 상태가 되므로 프로세스가 종료되지 않는다.

 

출처 - www.winapi.co.kr

[출처] WM_CLOSE / WM_DESTROY|작성자 바부

반응형

+ Recent posts