WM_DESTROY

인수

인수 없음

설명

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

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

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

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

리턴

이 메시지를 처리했으면 0을 리턴해야 한다.

예제

다음 예제는 윈도우가 파괴될 때 자신의 위치를 레지스트리에 저장한다. 이 윈도우는 메인 윈도우이므로 종료 처리를 한 후 PostQuitMessage 함수를 호출하여 프로세스를 종료하였다.

	case WM_DESTROY:
		RegCreateKeyEx(HKEY_CURRENT_USER, 
			"Software\\KanamSoft\\RegiTest\\Position",0,NULL,
			REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL,&key,&dwDisp);
		GetWindowRect(hWnd, &rt);
		RegSetValueEx(key, "Left",0,REG_DWORD,(LPBYTE)&rt.left,sizeof(LONG));
		RegSetValueEx(key, "Top",0,REG_DWORD,(LPBYTE)&rt.top,sizeof(LONG));
		RegSetValueEx(key, "Right",0,REG_DWORD,(LPBYTE)&rt.right,sizeof(LONG));
		RegSetValueEx(key, "Bottom",0,REG_DWORD,(LPBYTE)&rt.bottom,sizeof(LONG));
		RegCloseKey(key);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

 

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr