다음의 예제를 살펴 봅시다.
---------------------------------------------------------------------------------
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch( message )
{
case WM_LBUTTONDOWN:
// 실행창 아무 곳에서 마우스 왼쪽 버튼을 눌러도 아무 반응이 없다.
// 메시지 박스가 뜨지 않는다. 에러도 없다.
MessageBox(_T("LRESULT CMainFrame::WindowProc(msg, wParam, lParam)"),
_T("SUCCEEDED"), MB_OK);
break;
}
}
LRESULT CmyView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
switch( message )
{
case WM_LBUTTONDOWN:
// 이것은 에러없이 메시지 박스가 잘 뜬다.
MessageBox(_T("void CmyView::OnLButtonDown(UINT nFlags, CPoint point)"),
_T("SUCCEEDED"), MB_OK);
break;
}
return CView::WindowProc(message, wParam, lParam);
}
---------------------------------------------------------------------------------
똑같은 함수의 재정의인데 CMainFrame::WindowProc( ... )에서는 안되고
CmyView::WindowProc( ... )에서는 가능한 이유는 무엇일까요? 이것은 당연합니다.
CMainFrame은 오직 Non-Client 영역에 대한 메시지만 받을 수 있습니다.
Non-Client 영역이라고 함은 캡션바(타이틀)과 메뉴바에 대한 영역의 메시지만 받을 수 있습니다.
그러니까 CMainFrame에서는 WM_LBUTTONDOWN이 아니라, WM_NCLBUTTONDOWN이라고 해야 캡
션바나 메뉴바를 클릭했을 때 이벤트를 받을 수 있습니다. 클라이언트 영역을 아무리 클릭해봐야 실제로
CMainFrame에서 클라이언트 영역(작업 영역 : 흰색 윈도우 부분)을 포함하지만, 자신의 영역이 CMyView
클래스 윈도우 영역이 가려져 있기 때문에 이벤트가 발생하지 않는 겁니다. Z-ORDER가 CMyView 클래스
윈도우 영역이 더 높기 때문입니다. 그러니까 쉽게 말해서 CMainFrame의 클라이언트 영역이 존재하지만,
그 위에 CMyView 윈도우 영역으로 덮혀져 있기 때문에 메시지를 받을 수 없는 겁니다. 반면에 CMyView
클래스 윈도우 영역에서는 Non-Client 영역에 대한 메시지를 받을 수 없지요. 왜냐하면 그 크기가 흰색 영
역만을 포함하기 때문입니다.
Written By Sim-Hyeon, Choe