• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        區(qū)分與理解消息反射機(jī)制

        區(qū)分與理解消息反射機(jī)制

        更新時間:2022-05-14 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

        鄭力群

        前言:

          我曾寫過一篇文章對通知消息WM_NOTIFY進(jìn)行分析,消息反射是MFC中對通知消息的處理方式,兩者之間關(guān)系十分緊密,因此,我寫了這篇文章,希望能夠描繪出通知消息的完整印象。

        消息反射的基礎(chǔ)知識

        1、消息反射解釋:
          父窗口將控制子窗口發(fā)給它的通知消息,首先反射回子窗口進(jìn)行處理(即給控制子窗口一個機(jī)會,讓控制子窗口處理此消息),這樣通知消息就有機(jī)會能被子窗口自身進(jìn)行處理。

        2、MFC中引入消息反射的原因:
          在Windows的消息處理中,控制子窗口的發(fā)給其父窗口的通知消息只能由其父窗口進(jìn)行處理,這使得控制子窗口的自身能動性大大降低(你想,它連改變自己的背景色,處理一個自身滾動問題都要其父窗口來完成),為了解決這個問題,在MFC中引入了反射消息“Reflect Message”的概念,進(jìn)行消息反射,可以使得控制子窗口能夠自行處理與自身相關(guān)的一些消息,增強(qiáng)了封裝性,從而提高了控制子窗口的可重用性。

        消息反射的處理流程(不考慮OLE控制)

        一、消息反射處理流程圖:
          1、父窗口收到控制子窗口發(fā)來的通知消息后,調(diào)用它的虛函數(shù)CWnd::OnNotify.
        CWnd::OnNotify()主體部分:
        {
        if (ReflectLastMsg(hWndCtrl, pResult)) //此時,hWndCtrl,為發(fā)送窗口,即子窗口的窗口句柄
        return TRUE; // 子窗口已處理了此消息
        AFX_NOTIFY notify;
        notify.pResult = pResult;
        notify.pNMHDR = pNMHDR;
        return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY), &not;ify, NULL);
        }

          分析:首先,調(diào)用ReflectLastMsg(hCtrlChildWnd,...)給子窗口一個自身處理的機(jī)會,將消息反射給子窗口處理,函數(shù)返回TRUE,表明子窗口處理了此消息。反之,表示子窗口未處理此消息,此時,調(diào)用OnCmdMsg(...)由父窗口進(jìn)行通常的處理。

          2、ReflectLastMsg中:
          主要是調(diào)用發(fā)送窗口的SendChildNotifyLastMsg(...)。

          3、SendChildNotifyLastMsg 中:
          調(diào)用發(fā)送窗口的虛函數(shù)OnChildNotify函數(shù),進(jìn)行處理。 如果沒有處理,則調(diào)用ReflectChildNotify(...)函數(shù)進(jìn)行標(biāo)準(zhǔn)的反射消息的消息映射處理。


        二、消息處理

        方式1:
          由上述處理流程可以看出來,子窗口要想自身處理此消息,重載子控件窗口的OnChildNotify虛擬函數(shù)應(yīng)該是很容易想到的方式。

          注意:MFC中對各個子控件窗口一般都已經(jīng)重載了OnChildNotify函數(shù),它對應(yīng)調(diào)用類的虛函數(shù)進(jìn)行處理,所以,你重載對應(yīng)的虛函數(shù)即可,如下例:
        BOOL CStatusBarCtrl::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,LRESULT* pResult)
        {
        if (message != WM_DRAWITEM) //對應(yīng)不同的控制,會有不同的有特殊處理要求的消息。
        return CWnd::OnChildNotify(message, wParam, lParam, pResult);
        ...
        ...
        DrawItem((LPDRAWITEMSTRUCT)lParam);
        return TRUE;
        }
        virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
        void CStatusBarCtrl::DrawItem(LPDRAWITEMSTRUCT)
        {
        ASSERT(FALSE); // must override for self draw status bars
        }

          你重載CSTatusBarCtrl類的DrawItem虛擬函數(shù),即可實(shí)現(xiàn)對反射消息WM_DRAWITEM的處理。

        方式2:
          從方式1可以看出,如果你不在被重載的OnChildNotify中對消息進(jìn)行處理,函數(shù)會調(diào)用CWnd::OnChildNotify,它調(diào)用ReflectChildNotify函數(shù)進(jìn)行標(biāo)準(zhǔn)的處理。
        1、增加反射消息的映射入口。
        2、增加對應(yīng)的消息處理函數(shù)。
        注意:可以使用MFC的ClassWizard作上述動作,在ClassWizard中,可處理的反射消息以一個"="號以示區(qū)別。返回值為TRUE,表示控件窗口已處理此反射消息,為FALSE,表示控件子窗口未處理此反射消息。

        結(jié)語:

          消息反射不是很難的概念。它僅出現(xiàn)在MFC中;它的用意是方便控制子窗口的重用;對某些通知消息你可以重載對應(yīng)的虛函數(shù)(WM_DRAWITEM...)進(jìn)行處理;對其它你可以使用標(biāo)準(zhǔn)的消息反射映射進(jìn)行處理。限于篇幅,一些細(xì)節(jié)問題,請閱讀MFC中對應(yīng)的源代碼。  

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 午夜免费福利网站| 亚洲国产精品自产在线播放| h片在线观看免费| 亚洲AV成人一区二区三区在线看| 亚洲成AV人片在| 无码一区二区三区AV免费| 亚洲av日韩综合一区二区三区| 久久亚洲AV永久无码精品| 毛片免费观看的视频在线| 有色视频在线观看免费高清在线直播| 亚洲色欲久久久综合网| 国产一区视频在线免费观看| 4hu四虎最新免费地址| 国产免费伦精品一区二区三区| 亚洲精品在线播放| 亚洲处破女AV日韩精品| 国产亚洲精品激情都市| 亚洲国产精品综合久久网络 | 国产AV无码专区亚洲AV手机麻豆| 在线A级毛片无码免费真人| 中文字幕a∨在线乱码免费看| 亚洲国产精品xo在线观看| 亚洲AV本道一区二区三区四区| 宅男666在线永久免费观看| 免费av片在线观看网站| 国产午夜无码片免费| ww在线观视频免费观看w| 成人福利在线观看免费视频| 高潮内射免费看片| 日韩精品亚洲专区在线影视| 亚洲首页在线观看| 国产啪亚洲国产精品无码| 免费一级毛片女人图片| 人人狠狠综合久久亚洲高清| 亚洲一级免费视频| 猫咪免费人成网站在线观看| 日本阿v免费费视频完整版| 99热在线精品免费全部my| 一个人免费观看在线视频www| 成年女人午夜毛片免费看| 青青青国产免费一夜七次郎|