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

平凡的天才

目的是為人類造福
posts - 20, comments - 41, trackbacks - 0, articles - 6
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

MFC消息詳解

Posted on 2007-03-09 11:22 平凡的天才 閱讀(7534) 評論(0)  編輯 收藏 引用

轉載自http://blog.csdn.net/Image_Graphics/archive/2006/11/22/1405436.aspx


1. 怎樣使用MFC發送一個消息用MFC發送一個消息的方法是,
????首先,應獲取接收消息的CWnd類對象的指針;
????然后,調用CWnd的成員函數SendMessage( )。
????????LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);
????????pWnd指針指向目標CWnd類對象。變量Msg是消息,wParam和lParam變量包含消息的參數,如鼠標單擊哪里或選擇了什么菜單項。目標窗口返回的消息結果放在變量Res中。
????????發送消息到一個沒有CWnd類對象的窗口,可以用下列目標窗口的句柄直接調用Windows API:
????????LRESULT Res=::SendMessage(HWND hWnd, UINT Msg,? WPARAM wParam, LPARAM lParam);
????????這里的hWnd是目標窗口的句柄。
2. 怎樣用MFC寄送一個消息
????用MFC寄送一個消息與發送一個消息幾乎相同,但寄送時用PostMessage( ) ,而不是用SendMessage( );返回值Res也不一樣,Res不是一個由目標窗口返回的值,而是一個布爾值,用來表示消息是否成功地放到消息隊列中。
3. 檢索一個寄送消息
????正常情況下,一旦消息被寄送后,應用程序在后臺發送它。但是在特殊情況下,需要你自己去刪除一個消息,例如想在應用程序接收到某種消息之前停止應用程序。有兩種方法可以從應用程序消息隊列中刪除一個消息,但這兩種方法都沒有涉及MFC。
■ 第一種方法:在不干擾任何事情之下窺視消息隊列,看看一個消息是否在那里。
????BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
■ 第二種方法:實際上是等待,一直等到一個新的消息到達隊列為止,然后刪除并返回該消息。
????BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
????在這兩種方法中,變量hWnd指定要截獲消息的窗口,如果該變量設為NULL,所有窗口消息將被截獲。wMsgFilterMin和wMsgFilterMax變量與SendMessage( )中的變量Msg相對應,指定查看消息的范圍。如果用"0,0",則所有的消息都將被截獲。如果用WM_KEYFIRST,WM_KEYLAST或WM_MOUSEFIRST,WM_MOUSELAST,則所有鍵盤或鼠標的消息將被截獲。wRemoveMsg變量指定PeekMessage( )是否應該真正地從隊列中刪除該消息。(GetMessage( )總是刪除消息)。該變量可以取兩個值:
????■ PM_REMOVE,PeekMessage( )將刪除消息。
????■ PM_NOREMOVE,PeekMessage( )將把消息留在隊列里,并返回它的一個拷貝。
????當然,如果把消息留在消息隊列中,然后再次調用PeekMessage( )查看相同類型的消息,則將返回完全相同的消息。
????lpMsg變量是一個指向MSG結構的指針,MSG包含檢索到的消息。
????typedef struct tagMSG {
????????????????????????HWND hwnd; // window handle message is intended for
????????????????????????UINT message;
????????????????????????WPARAM wParam;
????????????????????????LPARAM lParam;
????????????????????????DWORD time; // the time the message was put in the queue
????????????????????????POINT pt; // the location of the mouse cursor when the
?????????????????????????????????????? // message was put in the queue
????????????????????????} MSG;
4. MFC怎樣接收一個寄送的消息
??? MFC處理一個寄送和發送消息的唯一明顯不同是寄送的消息要在應用程序的消息隊列中花費一些時間。在消息泵(message pump)彈出它之前,它要一直在隊列中。
??? 消息泵
??? MFC應用程序中的消息泵在CWinApp的成員函數Run()中。應用程序開始運行時,Run()就被調用,Run()把時間分割成兩部分。一部分用來執行后臺處理,如取消臨時CWnd對象;另一部分用來檢查消息隊列。當一個新的消息進來時,Run()抽取它—即用GetMessage( )從隊列中取出該消息,運行兩個消息翻譯函數,然后用DispatchMessage( )函數調用該消息預期的目標窗口進程。
??? 消息泵調用的兩個翻譯函數是PreTranslateMessage( )和::TranslateMessage( )。目標窗口的MFC類可調用reTranslateMessage在發送消息給它之前進行消息翻譯,例如,CFrameWnd用PreTranslateMessage( )將加速鍵(如,Ctrl+S存儲文件)轉換為命令消息。翻譯前的消息通常被處理掉,而翻譯后的消息(如果有的話)將被重新寄送到隊列里。::TranslateMessage是一個窗口函數,將原始鍵碼轉換為鍵字符。消息一旦被DispatchMessage()發送,MFC處理它就像處理SendMessage()發送的消息一樣。
5. MFC怎樣處理一個接收到的消息
??? 處理接收到的消息的目的非常簡單:將消息指向一個函數,該函數通過消息中的消息標識符處理它。非MFC窗口用簡單的case語句來實現該目標,每個case語句執行一些函數,或調用其他一些函數。
??? MainWndProc(HWND hWnd, UINT message, W PARAM wParam,LPARAM lParam)
??? {
??????? switch(message)
??????? {
??????? case WM_CREATE:
??????????? : : :
??????? break;
??????? case WM_PAINT:
??????????? : : :
??????? break;
??????? default:
??????? return(DefWindowProc(hWnd,message,wParam,lParam));
??????? }
??????? return(NULL);
??? }
??? 任何遺漏的消息將被傳輸到一個默認的消息處理函數,但是,case語句不能很好地適應C++和封裝技術。在C++環境中,要求消息被一個專門處理該類型消息的類的成員函數處理。因此,MFC不采用case語句,而采用更加復雜和回旋的方法。但它允許用私有類處理消息,而只需做下面三件事情:
??? ■ 從將要接收消息的CWnd類對象派生類(對于命令消息是CCmdTarget)。
??? ■ 在派生類中寫一個處理消息的成員函數。
??? ■ 在類中定義一個查找表(叫做消息映像),該表具有成員函數的條目和它要處理的消息的標識符。
??? 然后,MFC依次調用下面的函數,指引輸入消息到處理函數。
??? 1) AfxWndProc( )接收消息,尋找消息所屬的CWnd對象,然后調用AfxCallWndProc( )。
??? 2) AfxCallWndProc( )存儲消息(消息標識符和參數)供未來參考,然后調用WindowProc( )。
??? 3) WindowProc( ) 發送消息給OnWndMsg( ) ,然后,如果消息未被處理,則發送給DefWindowproc( )。
??? 4) OnWndMsg( )要么為WM_COMMAND消息調用OnCommand( ),要么為WM_NOTIFY消息調用OnNotify( )。任何被遺漏的消息都將是一個窗口消息。OnWndMsg( )搜索類的消息映像,以找到一個能處理任何窗口消息的處理函數。如果OnWndMsg( )不能找到這樣的處理函數,則把消息返回到WindowProc( ),由它將消息發送給DefWindowProc( )。
??? 5) OnCommand()查看這是不是一個控件通知(lParam不是NULL);如果它是,OnCommand( )就試圖將消息映射到制造通知的控件;如果它不是一個控件通知,或者控件拒絕映射的消息,OnCommand( )就調用OnCmdMsg( )。
??? 6) OnNotify( )也試圖將消息映射到制造通知的控件;如果映射不成功, OnNotify( )就調用相同的OnCmdMsg( )函數。
??? 7) 根據接收消息的類,OnCmdMsg( )將在一個稱為命令傳遞(Command Routing)的過程中潛在地傳遞命令消息和控件通知。例如,如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,并為該類尋找一個消息處理函數。
為什么要消息映像?
??? 這畢竟是C++語言;為什么OnWndMsg( )不為每個窗口消息調用一個預定義的虛擬函數?因為它太占CPU。若是那樣,當掃描一個消息映像以加速該過程時,OnWndMsg( )可能會做出意想不到的事情,并陷入匯編器。注意通過重載WindowProc( )、OnWndMsg( )、OnCommand( )、OnNotify( ) 或OnCmdMsg( )可以修改這一過程。重載OnWndMsg( )可以在窗口消息被排序之前插入該過程。重載OnCommand( )或OnNotify( )可以在消息被反射之前插入該過程。


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美国产另类| 久久婷婷麻豆| 亚洲专区在线| 亚洲永久字幕| 亚洲制服av| 午夜久久美女| 久久福利影视| 久久久精品日韩欧美| 久久亚洲综合色| 蜜臀av性久久久久蜜臀aⅴ四虎| 狂野欧美一区| 欧美精品九九99久久| 欧美日韩国产a| 国产精品久久久久99| 国产日韩精品一区观看| 国内精品福利| 亚洲破处大片| 国产精品99久久久久久www| 亚洲网站啪啪| 久久九九国产| 美女91精品| 亚洲欧洲日本在线| 一区二区三区高清视频在线观看| 亚洲一区二区三| 久久精品日韩| 欧美激情按摩在线| 国产精品午夜电影| 尤物yw午夜国产精品视频明星| 亚洲欧洲另类| 亚洲欧美日韩精品综合在线观看| 久久久国产精品一区二区三区| 欧美大片18| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲另类春色国产| 亚洲专区在线| 久久午夜电影网| 91久久精品网| 午夜精品久久久久久久久久久| 久久免费视频网| 欧美日韩美女在线| 国内揄拍国内精品少妇国语| 亚洲激情啪啪| 欧美亚洲免费高清在线观看| 男女精品网站| 在线综合亚洲| 欧美成年人在线观看| 国产精品久久久久久久久久免费 | 久久er99精品| 亚洲黄色在线| 欧美一区二区三区另类| 欧美久久久久久久久久| 国产亚洲欧美一区二区三区| 99精品欧美一区二区三区| 欧美在线网站| 999亚洲国产精| 久久精品一区二区三区不卡牛牛| 欧美日韩一区综合| **欧美日韩vr在线| 欧美中文字幕在线| 日韩视频中午一区| 免费成人黄色av| 国产日韩欧美在线| 亚洲一区二区免费| 亚洲电影免费观看高清| 欧美一区二区在线播放| 欧美色区777第一页| 91久久在线| 久久综合国产精品| 午夜欧美电影在线观看| 欧美日韩 国产精品| 亚洲国产精品成人一区二区| 久久久久99精品国产片| 亚洲视频网站在线观看| 欧美巨乳在线| 亚洲国产日韩在线一区模特| 久久久亚洲人| 亚洲欧美三级在线| 国产精品老牛| 亚洲亚洲精品三区日韩精品在线视频| 亚洲电影有码| 久久影院午夜论| 激情久久综艺| 久久久久久久国产| 午夜精品久久久| 国产精品影片在线观看| 亚洲制服av| 一区二区三区波多野结衣在线观看| 欧美freesex交免费视频| 在线观看精品| 麻豆国产精品777777在线| 久久9热精品视频| 国产亚洲精品aa| 久久高清福利视频| 午夜亚洲一区| 国产一区二区三区电影在线观看| 亚洲欧美日韩在线不卡| 亚洲一二三四久久| 国产精品三上| 欧美呦呦网站| 欧美专区亚洲专区| 韩国免费一区| 欧美11—12娇小xxxx| 久久久夜精品| 亚洲国产精品视频一区| 欧美激情一区二区三区在线| 猛男gaygay欧美视频| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲高清久久网| 欧美国产免费| 欧美激情2020午夜免费观看| 日韩一区二区精品葵司在线| 亚洲精品视频在线播放| 欧美日韩另类视频| 亚洲欧美国产精品桃花 | 国产精品久久久久久亚洲调教| 亚洲资源在线观看| 午夜亚洲福利在线老司机| 国产真实久久| 欧美福利电影在线观看| 欧美精品少妇一区二区三区| 亚洲午夜激情网站| 小辣椒精品导航| 在线免费精品视频| 91久久久久久久久| 国产精品久久久久免费a∨| 欧美中文字幕不卡| 另类国产ts人妖高潮视频| 一本一本久久a久久精品综合妖精| 99re6这里只有精品| 国产欧美日韩精品专区| 蜜乳av另类精品一区二区| 欧美久久99| 久久国产精品一区二区三区四区 | 欧美在线观看日本一区| 亚洲第一综合天堂另类专| 91久久综合| 国产欧美日韩综合一区在线播放| 美女亚洲精品| 欧美视频在线观看 亚洲欧| 久久精品视频导航| 欧美高清hd18日本| 欧美一区二视频在线免费观看| 久久嫩草精品久久久精品一| av成人免费在线| 欧美在线视频免费| 99国产精品视频免费观看| 午夜影视日本亚洲欧洲精品| 亚洲欧洲视频| 午夜天堂精品久久久久| 亚洲伦理久久| 欧美一区日本一区韩国一区| 亚洲精品一区久久久久久| 亚洲欧美在线网| 亚洲九九爱视频| 欧美亚洲在线观看| 一区二区高清视频| 久久精品日产第一区二区三区| 亚洲少妇自拍| 老司机精品视频网站| 销魂美女一区二区三区视频在线| 蜜月aⅴ免费一区二区三区| 欧美在线观看一二区| 欧美精品久久久久久久| 开元免费观看欧美电视剧网站| 欧美午夜视频在线| 欧美激情免费观看| 国产亚洲欧美一区二区| 一本色道久久综合亚洲精品不卡| 在线播放不卡| 午夜精品理论片| 中日韩高清电影网| 毛片基地黄久久久久久天堂| 久久精品国产一区二区电影| 欧美日韩视频在线第一区| 欧美国产日韩xxxxx| 国内精品国产成人| 亚洲主播在线| 亚洲综合精品四区| 欧美日韩免费观看一区二区三区| 欧美福利视频在线观看| 激情久久五月天| 校园春色综合网| 香港久久久电影| 欧美亚洲第一区| 亚洲理伦电影| 99在线精品观看| 欧美—级在线免费片| 欧美激情免费在线| 亚洲福利专区| 久久免费视频在线观看| 久久午夜羞羞影院免费观看| 国产欧美日韩视频一区二区三区| 亚洲视频免费看| 亚洲一区bb| 国产精品成人av性教育| 亚洲乱亚洲高清| 中文亚洲欧美| 欧美午夜免费| 亚洲午夜久久久| 欧美一区高清|