命令訊息傳遞

來源:互聯網
上載者:User

 

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進行預設處理。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.