青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

深度剖析消息反射機(jī)制

  摘要:在前面我們分析了控件通知消息WM_NOTIFY,和WM_NOTIFY緊密聯(lián)系的還有一個(gè)MFC新特性:消息反射。本文中,我想就這個(gè)問題作一個(gè)全面的論述,如果有錯(cuò)誤,還望各路大蝦批評(píng)指正。

    什么是消息反射?
    在windows里面,子控件經(jīng)常向父控件發(fā)送消息,例如很多子控件要繪制自己的背景,就可能向父窗口發(fā)送消息WM_CTLCOLOR。對(duì)于從子控件發(fā)來的消息,父控件有可能在處理之前,把消息返還給子控件處理,這樣消息看起來就想是從父窗口反射回來一樣,故此得名:消息反射。

    消息反射的由來
    在windows和MFC4.0版本一下,父窗口(通常是一個(gè)對(duì)話框)會(huì)對(duì)這些消息進(jìn)行處理,換句話說,自控件的這些消息處理必須在父窗口類體內(nèi),每當(dāng)我們添加子控件的時(shí)候,就要在父窗口類中復(fù)制這些代碼,我們可以想象這是多么的復(fù)雜,代碼是多么的臃腫!
    我們可以想象,如果這些消息都讓父窗口類去做,父窗口就成了一個(gè)萬(wàn)能的神,一個(gè)臃腫不堪的代碼機(jī),無(wú)論如何消息的處理都集中在父窗口類中,會(huì)使父窗口繁重?zé)o比,但是子控件卻無(wú)事可做,并且代碼也無(wú)法重用,這對(duì)于一個(gè)程序員來講是多么痛苦的一件事?!
    在老版本的MFC中,設(shè)計(jì)者也意識(shí)到了這個(gè)問題,他們對(duì)一些消息采用了虛擬機(jī)制,例如:WM_DRAWITEM,這樣子控件就有機(jī)會(huì)控制自己的動(dòng)作,代碼的可重用性有了一定的提高,但是這還沒有達(dá)到大部分人的要求,所以在高版本的MFC中,提出了一種更方便的機(jī)制:消息反射。
    通過消息反射機(jī)制,子控件窗口便能夠自行處理與自身相關(guān)的一些消息,增強(qiáng)了封裝性,同時(shí)也提高了子控件窗口類的可重用性。不過需要注意的是:消息反射是MFC實(shí)現(xiàn)的,不是windows實(shí)現(xiàn)的;要讓你的消息反射機(jī)制工作,你得類必須從CWnd類派生。

    Message-Map中的處理
    如果想要處理消息反射,必須了解相應(yīng)的Message-Map宏和函數(shù)原型。一般來講,Message-Map是有一定的規(guī)律的,通常她在消息的前面加上一個(gè)ON_ ,然后再消息的最后加上 _REFLECT。例如我們前面提到的WM_CTLCOLOR 經(jīng)過處理后變成了ON_WM_CTLCOLOR_REFLECT;WM_MEASUREITEM則變成了ON_WM_MEASUREITEM_REFLECT。
    凡事總會(huì)有例外,這里也是這樣,這里面有3個(gè)例外:
    (1) WM_COMMAND 轉(zhuǎn)換成 ON_CONTROL_REFLECT;
    (2) WM_NOTIFY  轉(zhuǎn)換成 ON_NOTIFY_REFLECT;
    (3) ON_UPDATE_COMMAND_UI 轉(zhuǎn)換成 ON_UPDATE_COMMAND_UI_REFLECT;
    對(duì)于函數(shù)原型,也必須是以 afx_msg 開頭。

    利用ClassWizard添加消息反射
    (1)在ClassWizard中,打開選擇項(xiàng)Message Maps;
    (2)在下拉列表Class name中選擇你要控制的類;
    (3)在Object IDs中,選中相應(yīng)的類名;
    (4)在Messages一欄中找到前面帶有=標(biāo)記的消息,那就是反射消息;
    (5)雙擊鼠標(biāo)或者單擊添加按鈕,然后OK!

    消息處理的過程
  (1)子窗口向父窗口發(fā)送通知消息,激發(fā)父窗口去調(diào)用它的虛函數(shù)CWnd::OnNotify。大致的結(jié)構(gòu)如下
       BOOL CWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
       {
          if (ReflectLastMsg(hWndCtrl, pResult)) file://hWndCtrl,為發(fā)送窗口
                                    return TRUE; file://如果子窗口已處理了此消息,返回
          AFX_NOTIFY notify;
          notify.pResult = pResult;
          notify.pNMHDR = pNMHDR;
          return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY)? notify:NULL);
      }
  (2)ReflectLastMsg聲明如下:static BOOL PASCAL ReflectLastMsg(HWND hWndChild, LRESULT* pResult = NULL);
     它的主要任務(wù)就是調(diào)用發(fā)送窗口的SendChildNotifyLastMsg。
  (3)SendChildNotifyLastMsg聲明如下:BOOL SendChildNotifyLastMsg(LRESULT* pResult = NULL);
     調(diào)用發(fā)送窗口的虛函數(shù)OnChildNotify函數(shù),進(jìn)行處理。 如果發(fā)送窗口沒有進(jìn)行重載處理,則調(diào)用ReflectChildNotify(...)函數(shù)進(jìn)行標(biāo)準(zhǔn)的反射消息的消息映射處理。

    使用的一個(gè)例子
   
這里面我們舉一個(gè)簡(jiǎn)單的例子,希望大家能夠更清晰的掌握消息反射機(jī)制。
    (1)創(chuàng)建一個(gè)基于對(duì)話框的工程。
    (2)利用向?qū)?chuàng)建一個(gè)新的類:CMyEdit,基類是CEdit。
    (3)在CMyEdit頭文件中加入3個(gè)成員變量:
         COLORREF m_clrText ;
 COLORREF m_clrBkgnd ;
 CBrush   m_brBkgnd;
    (4)利用向?qū)г谄渲屑尤隬M_CTLCOLOR(看到了么,前面是不是有一個(gè)=?),并且將它的函數(shù)體改為:
         HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
        {
  pDC->SetTextColor( m_clrText );    // text
  pDC->SetBkColor( m_clrBkgnd );    // text bkgnd
  return m_brBkgnd;                // ctl bkgnd
        }
        同時(shí)我們?cè)?cpp文件中會(huì)看到ON_WM_CTLCOLOR_REFLECT(),這就是我們所說的經(jīng)過處理的宏,是不是很符合規(guī)則?
    (5)在對(duì)話框中加入一個(gè)Edit,增加一個(gè)關(guān)聯(lián)的變量,選擇Control屬性,類別為CMyEdit。
    (6)在對(duì)話框.cpp文件中加入#include "MyEdit.h",運(yùn)行,看到了什么?呵呵。
   
     事情到了一個(gè)階段,希望你能夠喜歡,明天見!


posted on 2007-07-18 15:28 旅途 閱讀(225) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 深入windows

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩一区二区三区在线视频| 亚洲第一级黄色片| 欧美激情综合色| 国产日产欧美一区| 亚洲欧美日韩中文在线制服| 亚洲一区制服诱惑| 欧美日韩国产探花| 亚洲视频一区在线观看| 亚洲精品一区二区三区99| 亚洲国产综合在线| 毛片一区二区三区| 亚洲高清在线观看| 欧美日韩国产综合在线| 日韩一级黄色大片| 欧美激情第六页| 亚洲欧洲精品一区二区三区| 日韩视频免费| 欧美日韩亚洲一区三区| 亚洲色图自拍| 久久综合色综合88| 亚洲国产精品va| 夜色激情一区二区| 欧美日韩免费观看中文| 亚洲美女av黄| 亚洲综合999| 国产精品影片在线观看| 久久不射2019中文字幕| 午夜视频精品| 亚洲三级观看| 正在播放亚洲一区| 亚洲男女自偷自拍| 国产亚洲欧美一区二区三区| 久久久午夜视频| 亚洲激情在线观看视频免费| 亚洲美女精品一区| 久久综合色天天久久综合图片| 亚洲美女精品一区| 国产精品yjizz| 午夜综合激情| 亚洲福利视频一区| 亚洲欧美日韩中文播放| 国产综合18久久久久久| 欧美福利电影在线观看| 亚洲一区二区在| 欧美mv日韩mv国产网站| 亚洲图色在线| 精久久久久久久久久久| 欧美日韩免费视频| 久久精品系列| 日韩网站在线观看| 久久中文字幕一区| 一区二区三区久久久| 国产一区二区剧情av在线| 欧美激情乱人伦| 午夜一区二区三视频在线观看| 亚洲国产第一| 久久精品国产v日韩v亚洲| 亚洲乱码精品一二三四区日韩在线 | 精品动漫3d一区二区三区免费版 | 亚洲在线中文字幕| 亚洲第一福利在线观看| 久久精品免费看| 亚洲图片激情小说| 亚洲成人自拍视频| 国产精品久久久久久久久久久久久| 久久九九精品99国产精品| 在线综合视频| 亚洲精品少妇网址| 欧美~级网站不卡| 欧美中文在线观看国产| 亚洲色图制服丝袜| 亚洲精品乱码视频| 国内精品久久久久影院薰衣草| 欧美日韩成人激情| 免费日韩视频| 久久精选视频| 蜜桃av综合| 亚洲一区尤物| 亚洲精品日韩一| 欧美激情一区二区三区不卡| 久久久99国产精品免费| 亚洲欧美日韩成人| 一区二区三区三区在线| 亚洲日本欧美| 在线日韩中文| 激情婷婷亚洲| 黄色精品一区| 国产一区二区三区自拍| 国产精品一区二区久久| 欧美三区美女| 欧美日韩 国产精品| 欧美极品aⅴ影院| 欧美激情一区二区三区高清视频 | 亚洲四色影视在线观看| 99精品国产在热久久下载| 亚洲国产精品国自产拍av秋霞| 亚洲高清三级视频| 国产一区二区三区在线观看免费 | 欧美电影免费观看高清完整版| 久久久伊人欧美| 久久久久中文| 久久一区欧美| 六十路精品视频| 老牛嫩草一区二区三区日本| 久久免费视频网| 乱中年女人伦av一区二区| 麻豆视频一区二区| 欧美波霸影院| 欧美日本在线播放| 欧美日韩一区二区免费视频| 欧美日韩精品免费观看视频完整 | 国产精品亚洲精品| 国产一区二区0| 精品动漫一区| 亚洲日本中文字幕| 亚洲视频在线观看免费| 午夜久久99| 噜噜噜91成人网| 亚洲国产你懂的| 这里只有精品丝袜| 欧美在线免费视屏| 久久综合影音| 欧美日韩亚洲一区三区 | 欧美精品一区二区三区一线天视频 | 午夜天堂精品久久久久| 久久久久久久97| 欧美激情一区在线观看| 国产精品久久久久9999吃药| 国产午夜亚洲精品羞羞网站| 亚洲第一视频网站| 亚洲天堂偷拍| 久久久久久成人| 亚洲黄色av一区| 亚洲专区在线视频| 久久夜色撩人精品| 欧美调教vk| 国产亚洲欧美另类中文| 亚洲区欧美区| 久久av免费一区| 亚洲激情在线观看视频免费| 亚洲自拍三区| 欧美aa在线视频| 国产精品网红福利| 最新国产成人在线观看| 性做久久久久久久久| 欧美国产欧美综合| 午夜久久久久久久久久一区二区| 欧美a级在线| 国产亚洲精品美女| 99精品久久久| 久久裸体艺术| 在线综合+亚洲+欧美中文字幕| 久久这里只有精品视频首页| 国产精品福利网站| 亚洲日韩欧美视频一区| 久久久91精品国产| 一区二区三区高清在线 | 亚洲欧美精品suv| 欧美精品一区二区精品网| 国产一区二区三区久久精品| 一区二区三区国产在线观看| 久色成人在线| 亚洲综合日韩在线| 狠狠色丁香婷婷综合久久片| 在线免费高清一区二区三区| 亚洲男人天堂2024| 亚洲欧洲免费视频| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美一二区视频| 欧美日韩一级片在线观看| 国内一区二区在线视频观看| 亚洲永久网站| 一本色道久久综合亚洲精品小说| 老鸭窝91久久精品色噜噜导演| 亚洲性线免费观看视频成熟| 欧美剧在线观看| 亚洲激情第一页| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲欧美日产图| 欧美xart系列高清| 亚洲国产精品第一区二区三区| 久久久久久久久久久一区| 亚洲一级二级| 欧美视频中文一区二区三区在线观看| 午夜精品免费| 久久精品国产99国产精品澳门| 国产精品久久久久一区二区| 99精品热视频只有精品10| 亚洲国产成人久久综合| 久久久国产精品一区二区中文| 国产亚洲欧美一区在线观看 | 国产日韩精品一区观看| 新67194成人永久网站| 亚洲午夜av| 国产精品青草综合久久久久99| 亚洲在线电影| 亚洲免费视频在线观看| 国产伦精品免费视频| 欧美影院视频| 久久大逼视频|