2010. 4. 3. 12:06

CMainFrame과 CView의 이벤트 드리븐 차이점

다음의 예제를 살펴 봅시다.

---------------------------------------------------------------------------------

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