2009. 3. 30. 23:51
Command Routing & OnCmdMsg
2009. 3. 30. 23:51 in 3. Implementation/MFC
Command Message 는 메뉴에서 아이템이 선택되었을 때, 키보드 단축키(accelerator)가 눌려졌을때, 툴바 버튼이 클릭되었을 때 발생되는 WM_COMMAND 메시지를 위한 MFC의 용어이다.
이러한 Command Message는 아래 그림처럼 해당 메시지를 처리하기 전까지 관련된 객체에 라우팅되며 만일 메시지 처리기가 없는 경우에는 DefWindowProc 에게 처리하도록 한다.
일반적으로, File-New, File-Open, and File-Exit 명령어는 application 객체에 매핑되고 CWinApp 는 그러한 메시지를 처리하기 위해 OnFileNew, OnFileOpen, OnAppExit 명령어 핸들러를 제공한다. File-Save 와 File-Save As 는 일반적으로 다큐먼트 객체에 의해 다루어 지며, 다큐먼트 객체는 CDocument::OnFileSave 와 CDocument::OnFileSaveAS 라고 명명된 디폴트 명령어 핸들러를 제공한다. 툴바와 상태바를 보이거나 숨기는 명령어들은 CFrameWnd 멤버 함수를 사용하는 프레임 윈도우에 의해 다루어진다, 그리고 대부분의 다른 명령어들은 다큐먼트나 뷰에 의해서 다루어 진다.
중요한 점은 메시지 핸들러를 놓는 곳은 라우팅 되는 command message 나 사용자 인터페이스 업데이트에만 해당된다는 것이다. WM_CHAR, WM_LBUTTONDOWN, WM_CREATE, WM_SIZE와 같은 표준 윈도우즈 메시지는 그 메시지를 받는 윈도우에 의해서 다루어져야만 한다. 마우스와 키보드 메시지는 일반적으로 View 에 전해지고, 대부분의 다른 메시지는 프레임 윈도우로 전해진다. 다큐먼트 객체와 애플리케이션 객체는 비명령어 메시지(noncommand messages)를 절대로 받지 않는다.
참고로 아래는 CFrameWnd::OnCmdMsg 의 Command Routing을 구현한 코드 예이다.
BOOL CFrameWnd::OnCmdMsg(...) { // Pump through current view FIRST. CView* pView = GetActiveView(); if (pView != NULL && pView->OnCmdMsg(...)) return TRUE; // Then pump through frame. if (CWnd::OnCmdMsg(...)) return TRUE; // Last but not least, pump through application. CWinApp* pApp = AfxGetApp(); if (pApp != NULL && pApp->OnCmdMsg(...)) return TRUE; return FALSE; } |
참고 : Programming Windows with MFC, 2nd Edition