国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MFC】07.MFC第三大機(jī)制:消息映射-筆記

這篇具有很好參考價(jià)值的文章主要介紹了【MFC】07.MFC第三大機(jī)制:消息映射-筆記。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本專欄上兩篇文章分別介紹了【MFC】05.MFC第一大機(jī)制:程序啟動(dòng)機(jī)制和【MFC】06.MFC第二大機(jī)制:窗口創(chuàng)建機(jī)制,這篇文章來(lái)為大家介紹MFC的第三大機(jī)制:消息映射

  • typfd要實(shí)現(xiàn)消息映射,必須滿足的三個(gè)條件:

    類必須繼承于CmdTargert

    類必須聲明重定義 DECLARE_MESSAGE_MAP

    類外必須實(shí)現(xiàn)DEGIN_MESSINGE_MAP()

    END_MESSAGE_MAP()

    自己的窗口類{
      LERESULT onCreate(WPARAM wParam,LPARAM lParam){
      AfxMessageBox("WM_CREATE");
      }
      
      //定義宏:
      DECLARE_MESSAGE_MAP()
    }
    
    //類外實(shí)現(xiàn)消息映射:
    BEGIN_MESSAGE_MAP(cMyFrameWnd,CFrameWnd)
      ON_MESSAGE(WM_CREATE,onCreate);
    END_MESSAGE_MAP()
    
  • 在Win32程序中封裝消息:

    我們定義一張映射表,當(dāng)進(jìn)入WndProc的時(shí)候,通過(guò)查找這張表的映射關(guān)系,來(lái)執(zhí)行對(duì)應(yīng)的函數(shù):

    typedef struct MESSAGE_ENTRY{
      int message;
      int (*pFun)(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
    }
    struct MESSAGE_ENTRY MessageMap[]{
      映射容器:
      WM_PAINT,函數(shù)地址
    }
    

MFC的消息映射機(jī)制:

  • 宏展開(kāi):
    DECLARE_MESSAGE_MAP(){
      //靜態(tài)函數(shù)
      static const AFX_MSGMAP* PASCAL GetThisMessageMap();
      //虛函數(shù)
        virtual const AFX_MSGMAP* GetMessageMap() const;
    }
    
    實(shí)現(xiàn)宏展開(kāi):
    DECLARE_MESSAGE_MAP(){
      //靜態(tài)函數(shù)
      static const AFX_MSGMAP* PASCAL GetThisMessageMap();
      //虛函數(shù)
    	virtual const AFX_MSGMAP* GetMessageMap() const;
    }
    
    BEGIN_MESSAGE_MAP(CMFCApplication1App, CWinApp){
        //這里是實(shí)現(xiàn)虛函數(shù),
      	const AFX_MSGMAP* theClass::GetMessageMap() const 
      		{ 
      		  return GetThisMessageMap();
      		} 
      		
      	const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
      	{ \
      		typedef theClass ThisClass;
      		typedef baseClass TheBaseClass;
      		static const AFX_MSGMAP_ENTRY _messageEntries[] = 
      		{
        		{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
      	 }; 
      		static const AFX_MSGMAP messageMap = 
      		{ &TheBaseClass::GetThisMessageMap,//我們的弗雷德靜態(tài)函數(shù)地址
      		&_messageEntries[0] };//本類消息結(jié)構(gòu)體的數(shù)組首地址
      		return &messageMap;
      	}			
    }
    

我們來(lái)看看struct AFXmMSGMAP_ENTRY結(jié)構(gòu)體:

struct AFX_MSGMAP_ENTRY
{
    UINT nMessage;   //消息ID
    UINT nCode;      //win32通知碼 
    UINT nID;        //命令I(lǐng)D WM_COMMAND 菜單 按鈕 快捷鍵 加速鍵  1000
    UINT nLastID;    //最后ID                                       1004
    UINT_PTR nSig;   //處理消息的類型
    AFX_PMSG pfn;    //我們的處理消息的函數(shù)地址
};

消息回調(diào):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-634587.html

LRESULT CALLBACK AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
    CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
    AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
    {
         pWnd->WindowProc(nMsg, wParam, lParam)
         {
            OnWndMsg(message, wParam, lParam, &lResult)
            {
                //函數(shù)簽名 里面有函數(shù)指針
                union MessageMapFunctions mmf;
                //返回鏈表頭節(jié)點(diǎn)
                const AFX_MSGMAP* pMessageMap; pMessageMap = this->GetMessageMap();
                
                const AFX_MSGMAP_ENTRY* lpEntry;
                
                for (/* pMessageMap already init'ed */; 
                        pMessageMap->pfnGetBaseMap != NULL;        //判斷節(jié)點(diǎn)等不等于空
                        pMessageMap = (*pMessageMap->pfnGetBaseMap)()//找下一個(gè)節(jié)點(diǎn)
                    )
                {
                        lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries,message, 0, 0)) != NULL)    
                        //消息函數(shù)的地址
                        mmf.pfn = lpEntry->pfn;
                        switch (lpEntry->nSig)
                        {
                            lResult = (this->*mmf.pfn_l_w_l)(wParam, lParam);
                        }
                }
            } 
         }
    }
}

到了這里,關(guān)于【MFC】07.MFC第三大機(jī)制:消息映射-筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【MFC】06.MFC六大機(jī)制:窗口創(chuàng)建機(jī)制-筆記

    接上文【MFC】05.MFC第一大機(jī)制:程序啟動(dòng)機(jī)制-筆記,這一篇文章來(lái)帶領(lǐng)大家逆向分析MFC第二大機(jī)制:窗口創(chuàng)建機(jī)制的源碼。 我們知道,在Win32編程中,如果我們要?jiǎng)?chuàng)建一個(gè)窗口,基本步驟為: 注冊(cè)窗口 創(chuàng)建一個(gè)窗口,必須要給一個(gè)類名稱 消息處理回調(diào)函數(shù) 那么MFC的窗口創(chuàng)建

    2024年02月13日
    瀏覽(22)
  • 【MFC】05.MFC六大機(jī)制:程序啟動(dòng)機(jī)制-筆記

    【MFC】05.MFC六大機(jī)制:程序啟動(dòng)機(jī)制-筆記

    MFC程序開(kāi)發(fā)所謂是非常簡(jiǎn)單,但是對(duì)于我們逆向人員來(lái)說(shuō),如果想要逆向MFC程序,那么我們就必須了解它背后的機(jī)制,這樣我們才能夠清晰地逆向出MFC程序,今天這篇文章就來(lái)帶領(lǐng)大家了解MFC的第一大機(jī)制:程序啟動(dòng)機(jī)制: 首先,我們創(chuàng)建一個(gè)單文檔架構(gòu)程序,我們來(lái)觀察一

    2024年02月13日
    瀏覽(16)
  • 【MFC】05.MFC第一大機(jī)制:程序啟動(dòng)機(jī)制-筆記

    【MFC】05.MFC第一大機(jī)制:程序啟動(dòng)機(jī)制-筆記

    MFC程序開(kāi)發(fā)所謂是非常簡(jiǎn)單,但是對(duì)于我們逆向人員來(lái)說(shuō),如果想要逆向MFC程序,那么我們就必須了解它背后的機(jī)制,這樣我們才能夠清晰地逆向出MFC程序,今天這篇文章就來(lái)帶領(lǐng)大家了解MFC的第一大機(jī)制:程序啟動(dòng)機(jī)制: 首先,我們創(chuàng)建一個(gè)單文檔架構(gòu)程序,我們來(lái)觀察一

    2024年02月14日
    瀏覽(18)
  • 【MFC】06.MFC第二大機(jī)制:窗口創(chuàng)建機(jī)制-筆記

    接上文【MFC】05.MFC第一大機(jī)制:程序啟動(dòng)機(jī)制-筆記,這一篇文章來(lái)帶領(lǐng)大家逆向分析MFC第二大機(jī)制:窗口創(chuàng)建機(jī)制的源碼。 我們知道,在Win32編程中,如果我們要?jiǎng)?chuàng)建一個(gè)窗口,基本步驟為: 注冊(cè)窗口 創(chuàng)建一個(gè)窗口,必須要給一個(gè)類名稱 消息處理回調(diào)函數(shù) 那么MFC的窗口創(chuàng)建

    2024年02月14日
    瀏覽(22)
  • 【MFC】10.MFC六大機(jī)制:RTTI(運(yùn)行時(shí)類型識(shí)別),動(dòng)態(tài)創(chuàng)建機(jī)制,窗口切分,子類化-筆記

    【MFC】10.MFC六大機(jī)制:RTTI(運(yùn)行時(shí)類型識(shí)別),動(dòng)態(tài)創(chuàng)建機(jī)制,窗口切分,子類化-筆記

    C++: ##是拼接 #是替換成字符串 這是MFC提供的運(yùn)行時(shí)類信息的使用,如果我們自己創(chuàng)建一個(gè)類,如果想用這些方法,必須要滿足三個(gè)條件: 這個(gè)類必須繼承于CObject類 類內(nèi)必須聲明DECLARE_DYNAMIC 類外必須實(shí)現(xiàn)IMPLENENT_DYNAMIC 我們來(lái)看看是如何實(shí)現(xiàn)的: 這里給出RTTI的圖,每一個(gè)類中

    2024年02月13日
    瀏覽(24)
  • MFC 序列化機(jī)制

    MFC 序列化機(jī)制

    目錄 文件操作相關(guān)類 序列化機(jī)制相關(guān)類 序列化機(jī)制使用 序列化機(jī)制執(zhí)行過(guò)程 序列化類對(duì)象 CFile:文件操作類,封裝了關(guān)于文件讀寫等操作,常見(jiàn)的方法: CFile::Open:打開(kāi)或者創(chuàng)建文件 CFile::Write/Read:寫/讀文件 CFile::Close:關(guān)閉文件 CFile::SeekToBegin/SeekToEnd/Seek:從 開(kāi)始/結(jié)束

    2024年01月20日
    瀏覽(21)
  • 微軟MFC技術(shù)運(yùn)行機(jī)制

    微軟MFC技術(shù)運(yùn)行機(jī)制

    我是荔園微風(fēng),作為一名在IT界整整25年的老兵,今天總結(jié)一下微軟MFC技術(shù)運(yùn)行機(jī)制。 很多初學(xué)者誤以為VC++開(kāi)發(fā)必須使用MFC,其實(shí)不一定的。MFC的使用只能是提高程序在某些情況下的開(kāi)發(fā)效率,而不能替代整個(gè)Win32程序設(shè)計(jì)。我認(rèn)為我們有必要再來(lái)好好講講MFC的本質(zhì)、MFC中的

    2024年02月08日
    瀏覽(19)
  • MFC新建內(nèi)部消息

    MFC新建內(nèi)部消息

    提示:記錄一下MFC新建內(nèi)部消息的成功過(guò)程 文章目錄 前言 一、第一階段 二、第二階段 三、第三階段 總結(jié) 先說(shuō)一下基本情況,因?yàn)橐趍apview上增加一個(gè)顯示加載時(shí)間的功能。然后發(fā)現(xiàn)是要等加載完再顯示時(shí)間,顯示在主窗口。所以就是在子線程中發(fā)送消息給窗口的問(wèn)題。

    2024年02月09日
    瀏覽(21)
  • windows MFC消息demo

    2024年02月11日
    瀏覽(22)
  • 微軟MFC技術(shù)中消息的分類

    微軟MFC技術(shù)中消息的分類

    ?我是荔園微風(fēng),作為一名在IT界整整25年的老兵,今天來(lái)聊聊MFC技術(shù)中消息的分類。 微軟Windows中的消息雖然很多,但是種類并不繁雜,大體上有3種:窗口消息、命令消息和控件通知消息。 窗口消息是系統(tǒng)中最為常見(jiàn)的消息,它是指由操作系統(tǒng)和控制其他窗口所使用的消息。

    2024年02月13日
    瀏覽(14)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包