• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            MFC消息映射機制的剖析(孫鑫VC++講座筆記-(4)轉載并修改)

            一,消息映射機制

            1,消息響應函數:(例:在CDrawView類響應鼠標左鍵按下消息)
            1)在頭文件(DrawView.h)中聲明消息響應函數原型。
            //{{AFX_MSG(CDrawView) //注釋宏
            afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
            //}}AFX_MSG //注釋宏
            說明:
            在注釋宏之間的聲明在VC中灰色顯示。afx_msg宏表示聲明的是一個消息響應函數。

            這個注釋宏為的是讓ClassWizard能夠分辨出哪些代碼是它生成的,哪些是你自己寫的。
            你自己寫的代碼要在這個注釋之外,這樣ClassWizard再修改消息映射的時候就不會管你的代碼了。
            限于以前的硬件速度,ClassWizard比較傻冒,所以需要這些注釋宏來定位。從7.0開始,就不再需
            要了。新的屬性頁能夠自動分析你的代碼,為你添加或者刪除代碼,而無需什么特殊標記的幫忙。
            因此注釋宏已經是歷史產物了。

            2)在源文件(DrawView.cpp)中進行消息映射。
            BEGIN_MESSAGE_MAP(CDrawView, CView)
            //}AFX_MSG_MAP
            // Standard printing commands
            ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
            ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
            ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
            END_MESSAGE_MAP()
            說明:
            在宏BEGIN_MESSAGE_MAP()與END_MESSAGE_MAP()之間進行消息映射。
            宏ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN與它的響應函數OnLButtonDown()相關聯。這樣一旦有消息的產生,就會自動調用相關聯的消息響應函數去處理。
            宏ON_WM_LBUTTONDOWN()定義如下:
            #define ON_WM_LBUTTONDOWN()
            { WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp,
            (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(UINT, CPoint))&OnLButtonDown },
            3)源文件中進行消息響應函數處理。(DrawView.cpp中自動生成OnLButtonDown函數輪廓,如下)
            void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
            {
            // TODO: Add your message handler code here and/or call default
            CView::OnLButtonDown(nFlags, point);
            }
            說明:
            可見當增加一個消息響應處理,在以上三處進行了修改。可在消息響應函數里添加消息處理代碼完成對消息的響應、處理。

            2,消息響應的方式:
            1) 在基類中針對每種消息做一個虛函數,當子類對消息響應時候,只要在子類中重寫這個虛函數即可。缺點:MFC類派生層次很多,如果在基類對每個消息進行虛函 數處理,那么從基類派生的每個子類都將背負一個龐大的虛表,這樣浪費內存,故MFC沒有采取這中方式而采取消息映射方式。
            2)消息映射方式: MFC在后臺維護了一個句柄和C++對象指針對照表,當收到一個消息后,通過消息結構里資源句柄(查對照表)就可找到與它對應的一個C++對象指針,然后 把這個指針傳給基類,基類利用這個指針調用WindowProc()函數對消息進行處理,WindowProc()函數中調用OnWndMsg()函數, 真正的消息路由及處理是由OnWndMsg()函數完成的。由于WindowProc()和OnWndMsg()都是虛函數,而且是用派生類對象指針調用 的,由多態性知最總終調用子類的。在OnWndMsg()函數處理的時候,根據消息種類去查找消息映射,判斷所發的消息有沒有響應函數,具體方式是到相關 的頭文件和源文件中尋找消息響應函數聲明(從注釋宏//}AFX_MSG之間尋找),消息映射(從宏BEGIN_MESSAGE_MAP(...)....END_MESSAGE_MAP()之間尋找),最終找到對應的消息處理函數。當然,如果子類中沒有對消息進行處理,則消息交由基類處理。
            說明:
            virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
            virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult);

            posted on 2007-03-02 09:58 王光平 閱讀(918) 評論(0)  編輯 收藏 引用 所屬分類: 編程技術

            <2007年3月>
            25262728123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            留言簿(4)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            亚洲成人精品久久| 99久久国产综合精品麻豆| 久久精品国产黑森林| 伊人久久大香线蕉AV一区二区| 色老头网站久久网| 精品久久久久久亚洲精品| 久久国产综合精品五月天| 午夜天堂精品久久久久| 国产AV影片久久久久久| 久久精品国产亚洲AV香蕉| 久久99久久99小草精品免视看| 亚洲精品WWW久久久久久| 久久精品国产亚洲av高清漫画| 蜜桃麻豆www久久国产精品| 久久亚洲AV成人无码电影| 亚州日韩精品专区久久久| 久久精品国产亚洲av日韩| 亚洲欧美另类日本久久国产真实乱对白| 99久久精品日本一区二区免费| 久久久久久久综合狠狠综合| 99久久精品无码一区二区毛片 | 久久亚洲精品中文字幕| 久久婷婷色综合一区二区| 色综合久久88色综合天天 | 久久久久这里只有精品 | 久久无码AV一区二区三区| 国产ww久久久久久久久久| 久久国产精品99久久久久久老狼| 精品久久久久久中文字幕大豆网| 欧美大战日韩91综合一区婷婷久久青草| 77777亚洲午夜久久多喷| 久久香综合精品久久伊人| 亚洲伊人久久精品影院| 日韩av无码久久精品免费| 欧洲成人午夜精品无码区久久| 伊人久久综合无码成人网| 四虎国产精品成人免费久久| 日韩久久久久中文字幕人妻| 亚洲精品乱码久久久久久蜜桃 | 久久大香香蕉国产| 久久久久久久97|