원본 : http://www.debuglab.com/knowledge/windowdect.html
1.요약
초보자들이 이해하기 어려워 하는 윈도우 소멸 순서에 대해서 알아 봅니다.
2.본문
MFC framework에서, 사용자가 frame 윈도를 닫게되면, 윈도는 기본적으로 OnClose 핸들을 call 합니다. 그리고 OnClose 내부에서는 DestroyWindow를 호출하죠. 가장 마지막으로 호출되는 함수는 OnNcDestroy이다. 이 함수는 약간의 정리를 하는 함수로 윈도를 정리하기 위하여 기본적으로 불려지는 함수입니다. OnNcDestroy함수 내부에서는 PostNcDestroy함수를 호출하겠죠.
1) CWnd내부에 있는 윈도를 destroy 한다.
2) 또한 윈도를 해제하고 입력 포커스를 제거하기 위한 적절한 message를 윈도에게 보낸다.
3) 윈도의 메뉴 제거
4) application queue를 비운다.
5) timer를 제거
6) clipboard의 소유주 제거
7) Clipboard-viewer chain을 끊는다. ( CWnd가 viewer chain의 맨 위에 있을 경우 )
8) WM_DESTROY( OnDestroy )와 WM_NCDESTROY( OnNcDestroy ) 메시지를 위도에게 보낸다.
하지만 아직 CWnd 객체는 destroy하지 않는다.
이 함수를 오버라이드 하더라도 이 함수를 호출하지 않아도 됩니다. ( 왜냐면 시스템이 알아서 호출을 해주니까..) 하지만, 굳이 하고 싶다면 해도 호출해도 됩니다. 그리고 만약 내부에 자식 윈도가 있더라도 걱정하지 않으셔도 됩니다. 왜냐하면, 자식들을 먼저 destroy한 다음에 자신이 죽기 때문이죠.
OnDestroy is called first for the CWnd being destroyed, then for the child windows of CWnd as they are destroyed. It can be assumed that all child windows still exist while OnDestroy runs.
- 2001.08.13 Smile Seo -
1.요약
초보자들이 이해하기 어려워 하는 윈도우 소멸 순서에 대해서 알아 봅니다.
2.본문
MFC framework에서, 사용자가 frame 윈도를 닫게되면, 윈도는 기본적으로 OnClose 핸들을 call 합니다. 그리고 OnClose 내부에서는 DestroyWindow를 호출하죠. 가장 마지막으로 호출되는 함수는 OnNcDestroy이다. 이 함수는 약간의 정리를 하는 함수로 윈도를 정리하기 위하여 기본적으로 불려지는 함수입니다. OnNcDestroy함수 내부에서는 PostNcDestroy함수를 호출하겠죠.
afx_msg OnClose( )Framework은 CWnd나 application을 종료 시키기 위해서 이 함수를 마치 시그날 처럼 호출한다. 내부의 기본적인 구현은 DestroyWindow를 호출한다.
virtual BOOL DestroyWindow( )Destroy Window 함수는
1) CWnd내부에 있는 윈도를 destroy 한다.
2) 또한 윈도를 해제하고 입력 포커스를 제거하기 위한 적절한 message를 윈도에게 보낸다.
3) 윈도의 메뉴 제거
4) application queue를 비운다.
5) timer를 제거
6) clipboard의 소유주 제거
7) Clipboard-viewer chain을 끊는다. ( CWnd가 viewer chain의 맨 위에 있을 경우 )
8) WM_DESTROY( OnDestroy )와 WM_NCDESTROY( OnNcDestroy ) 메시지를 위도에게 보낸다.
하지만 아직 CWnd 객체는 destroy하지 않는다.
이 함수를 오버라이드 하더라도 이 함수를 호출하지 않아도 됩니다. ( 왜냐면 시스템이 알아서 호출을 해주니까..) 하지만, 굳이 하고 싶다면 해도 호출해도 됩니다. 그리고 만약 내부에 자식 윈도가 있더라도 걱정하지 않으셔도 됩니다. 왜냐하면, 자식들을 먼저 destroy한 다음에 자신이 죽기 때문이죠.
afx_msg void OnDestroy()Framework이 CWnd에게 현재 CWnd가 소멸되고 있는 중이라고 알려 주기위하여 호출 합니다. OnDestroy함수는 CWnd 함수가 화면에서 사라진 다음에 호출됩니다.
OnDestroy is called first for the CWnd being destroyed, then for the child windows of CWnd as they are destroyed. It can be assumed that all child windows still exist while OnDestroy runs.
afx_msg void OnNcDestroy()Client가 아닌 영역이 destroy될 때 Frame work에 의하여 불려지는 함수입니다.. 윈도가 소멸될때 마지막으로 불려지는 함수이기도 하죠. 기본적으로 약간의 정리를 한후, PostNcDestroy 함수를 호출하는데, 대게는 이 함수를 오버라이드 하지 않지만 만약 하게되면 내부에서 상위 클래스의 OnNcDestroy를 호출해야만 합니다. 그렇지 않으면 내부적으로 윈도를 위해 할당된 메모리가 free되지 못하게 되죠.
virtual void PostNcDestroy()윈도가 소멸된 후 OnNcDestroy함수에 의하여 불려지는 기본함수입니다. 사용자들이 상속받아 만든 클래스의 정리를 위한 코드를 삽입하면 되죠. ( ex. delete this; )
- 2001.08.13 Smile Seo -
"MFC" 카테고리의 다른 글
- DirectDraw에서 256색 Bitmap 간편히 사용하기 (0)2007/03/01
- 메모리 DC 사용하기 (0)2007/03/01
- 일반적인 윈도우 소멸 순서 (0)2007/03/01
- 프로그램내에서 한/영 전환하기 (0)2007/03/01
- Resource ID 이름 짓는 방법 (0)2007/03/01
Tags 윈도우 소멸

수안이의 컴퓨터 연구실



Leave your greetings.