OnCmdMsg是虛擬函數,CFrameWnd覆蓋了該函數,當前對象(this所指)是MFC單文檔的邊框視窗對象。故CFrameWnd的OnCmdMsg被調用。CFrameWnd::OnCmdMsg在MFC訊息發送中佔有非常重要的地位,MFC對該函數的預設實現確定了MFC的標準命令發送路徑:
送給活動(Active)視處理,調用活動視的OnCmdMsg。由於當前對象是MFC視對象,所以,OnCmdMsg將搜尋CTview及其基類的訊息映射數組,試圖得到相應的處理函數。
如果視對象自己不處理,則視得到和它關聯的文檔,調用關聯文檔的OnCmdMsg。由於當前對象是MFC視對象,所以,OnCmdMsg將搜尋CTdoc及其基類的訊息映射數組,試圖得到相應的處理函數。
如果文檔對象不處理,則它得到管理文檔的文件範本對象,調用文件範本的OnCmdMsg。由於當前對象是MFC文件範本對象,所以,OnCmdMsg將搜尋文件範本類及其基類的訊息映射數組,試圖得到相應的處理函數。
如果文件範本不處理,則把沒有處理的資訊逐級返回:文件範本告訴文檔對象,文檔對象告訴視對象,視對象告訴邊框視窗對象。最後,邊框視窗得知,視、文檔、文件範本都沒有處理訊息。
CFrameWnd的OnCmdMsg繼續調用CWnd::OnCmdMsg(斜體表示有類屬限制)來處理訊息。由於CWnd沒有覆蓋OnCmdMsg,故實際上調用了函數CCmdTarget::OnCmdMsg。由於當前對象是MFC邊框視窗對象,所以OnCmdMsg函數將搜尋CMainFrame類及其所有基類的訊息映射數組,試圖得到相應的處理函數。CWnd沒有實現OnCmdMsg卻指定要執行其OnCmdMsg函數,可能是為了以後MFC給CWnd實現了OnCmdMsg之後其他代碼不用改變。
這一步是邊框視窗自己嘗試處理訊息。
如果邊框視窗對象不處理,則送給應用程式物件處理。調用CTApp的OnCmdMsg,由於實際上CTApp及其基類CWinApp沒有覆蓋OnCmdMsg,故實際上調用了函數CCmdTarget::OnCmdMsg。由於當前對象是MFC應用程式物件,所以OnCmdMsg函數將搜尋CTApp類及其所有基類的的訊息映射入口數組,試圖得到相應的處理函數
如果應用程式物件不處理,則返回FALSE,表明沒有命令目標處理當前的命令訊息。這樣,函數逐層級返回,OnCmdMsg告訴OnCommand訊息沒有被處理,OnCommand告訴OnWndMsg訊息沒有被處理,OnWndMsg告訴WindowProc訊息沒有被處理,於是WindowProc調用DefWindowProc進行預設處理。