CWnd::Create()는 CreateEx()를 호출하며 CreateEx()는 ::CreateWindowEx()를 호출하기
직전에 AfxHookWindowCreate()을 호출합니다.
AfxHookWindowCreate()은 SetWindowsHookEx()을 호출해서 WM_CREATE같은 메시지가 발생할경우
Hook procedure로 먼저 가게끔 Hook을 인스톨 해줍니다.
이 Hook procedure가 해주는 일이 바로 Subclassing을 하는 겁니다.
다시 말해서 View 클래스는 RegisterClass()에서 AfxFrameOrView란 이름으로 등록이 될때
DefWndProc()에서 모든 메시지가 처리가 되게 되어있는데 Hook procedure에서 DefWndProc()를
SetWindowLong()을 호출하여 AfxWndProc()로 바꿔주고 CView의 m_hWnd를 ::CreateWindowEx()의 return값인
hWnd 로 만드는 겁니다.
그러므로 이미 Create()를 호출하면 subclassing이 되어서 CChildView::m_hWnd가 NULL이 아니어서
ASSERT failure가 나오는 겁니다.
그러므로 m_pView->SubclassDlgItem(IDC_VIEW, this); 이건 필요가 없습니다.
다시말해서 CChildView의 모든 메시지는 AfxWndProc()로 가게 됩니다.
subclassing 필요없고 메시지처리는 그냥 view에서 하는것처럼 메시지맵에다가 핸들러를 넣어
주면 됩니다.
'MFC' 카테고리의 다른 글
MFC 메인 윈도우의 생성 흐름 (1) | 2008.09.01 |
---|---|
MFC 팁들 (0) | 2008.09.01 |
Creating New Documents, Windows, and Views (0) | 2008.09.01 |
MFC HandlingWindowMessages (1) | 2008.09.01 |
MFC Module State Implementation (0) | 2008.09.01 |
MFC - DLL에대한 정리 (0) | 2008.09.01 |
CWnd Class (2) | 2008.09.01 |