日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

MFC消息分類與消息隊列

2019-11-10 20:10:16
字體:
來源:轉載
供稿:網友
消息分類與消息隊列

Windows中,消息使用統一的結構體(MSG)來存放信息,其中message表明消息的具體的類型,

而wParam,lParam是其最靈活的兩個變量,為不同的消息類型時,存放數據的含義也不一樣。

time表示產生消息的時間,pt表示產生消息時鼠標的位置。

按照類型,Windows將消息分為:

(0) 消息ID范圍

系統定義消息ID范圍:[0x0000, 0x03ff]用戶自定義的消息ID范圍: WM_USER: 0x0400-0x7FFF (例:WM_USER+10) WM_APP(winver> 4.0):0x8000-0xBFFF (例:WM_APP+4) RegisterWindowMessage:0xC000-0xFFFF【用來和其他應用程序通信,為了ID的唯一性,使用::RegisterWindowMessage來得到該范圍的消息ID 】

(1) 窗口消息:即與窗口的內部運作有關的消息,如創建窗口,繪制窗口,銷毀窗口等。

     可以是一般的窗口,也可以是MainFrame,Dialog,控件等。 

     如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL等

(2) 當用戶從菜單選中一個命令項目、按下一個快捷鍵或者點擊工具欄上的一個按鈕,都將發送WM_COMMAND命令消息。

     LOWord(wParam)表示菜單項,工具欄按鈕或控件的ID;如果是控件, HIWORD(wParam)表示控件消息類型。

     #define LOWORD(l) ((WORD)(l))

     #define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))

(3) 隨著控件的種類越來越多,越來越復雜(如列表控件、樹控件等),僅僅將wParam,lParam將視為一個32位無符號整數,已經裝不下太多信息了。

    為了給父窗口發送更多的信息,微軟定義了一個新的WM_NOTIFY消息來擴展WM_COMMAND消息。

    WM_NOTIFY消息仍然使用MSG消息結構,只是此時wParam為控件ID,lParam為一個NMHDR指針,

    不同的控件可以按照規則對NMHDR進行擴充,因此WM_NOTIFY消息傳送的信息量可以相當的大。

注:Window 9x 版及以后的新控件通告消息不再通過WM_COMMAND 傳送,而是通過WM_NOTIFY 傳送,      但是老控件的通告消息, 比如CBN_SELCHANGE 還是通過WM_COMMAND 消息發送。

(4) windwos也允許程序員定義自己的消息,使用SendMessage或PostMessage來發送消息。

windows消息還可以分為:

(1) 隊列消息(Queued Messages) 消息會先保存在消息隊列中,消息循環會從此隊列中取出消息并分發到各窗口處理 如:WM_PAINT,WM_TIMER,WM_CREATE,WM_QUIT,以及鼠標,鍵盤消息等。其中,WM_PAINT,WM_TIMER只有在隊列中沒有其他消息的時候才會被處理,WM_PAINT消息還會被合并以提高效率。其他所有消息以先進先出(FIFO)的方式被處理。

(2) 非隊列消息(NonQueued Messages) 消息會繞過系統消息隊列和線程消息隊列,直接發送到窗口過程進行處理 如:WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR,WM_WINDOWPOSCHANGED

Windows系統的整個消息系統分為3個層級:

    ① Windows內核的系統消息隊列

    ② App的UI線程消息隊列

    ③ 處理消息的窗體對象

Windows內核維護著一個全局的系統消息隊列;按照線程的不同,系統消息隊列中的消息會分發到應用程序的UI線程的消息隊列中;

應用程序的每一個UI線程都有自己的消息循環,會不停地從自己的消息隊列取出消息,并發送給Windows窗體對象;

每一個窗體對象都使用窗體過程函數(WindowPRoc)來處理接收到的各種消息。

復制代碼復制代碼
 1 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 2 { 3     PAINTSTRUCT ps; 4     HDC hdc; 5  6     switch (message) 7     { 8     case WM_COMMAND: 9         break;10     case WM_PAINT:11         hdc = BeginPaint(hWnd, &ps);12         // TODO: 在此添加任意繪圖代碼...13         EndPaint(hWnd, &ps);14         break;15     case WM_DESTROY:16         PostQuitMessage(0);17         break;18     default:19         return DefWindowProc(hWnd, message, wParam, lParam);20     }21     return 0;22 }復制代碼復制代碼

需要的話,在WindowProc中,可以用::GetMessageTime獲取當前消息產生的時間,用::GetMessagePos獲取當前消息產生時鼠標光標所在的位置。

(1) 各個窗口消息由各個窗體(或控件)自身的WindowProc(虛函數)接收并處理。

(2) WM_COMMAND命令消息統一由當前活動主窗口的WindowProc接收,經過繞行后,可被其他的CCmdTarget對象處理。

(3) WM_COMMAND控件通知統一由子窗口(控件)的父窗口的WindowProc接收并處理,也可以進行繞行被其他的CCmdTarget對象處理。

     (例如:CFormView具備接受WM_COMMAND控件通知的條件,又具備把WM_COMMAND消息派發給關聯文檔對象處理的能力,

         所以給CFormView的WM_COMMAND控件通知是可以讓文檔對象處理的。)

     另外,WM_COMMAND控制通知會先調用ReflectLastMsg反射通知子窗口(控件),如果子窗口(控件)處理了該消息并返回TRUE,則消息會停止分發;

     否則,會繼續調用OnCmdMsg進行命令發送(如同WM_COMMAND命令消息一樣)。

注:WM_COMMAND命令消息與WM_COMMAND控件通知的相似之處:WM_COMMAND命令消息和WM_COMMAND控制通知都是由WindowProc給OnCommand處理,OnCommand通過wParam和lParam參數區分是命令消息或通知消息,然后送給OnCmdMsg處理。事實上,BN_CLICKED控件通知消息的處理和WM_COMMAND命令消息的處理完全一樣。因為該消息的通知代碼是0,ON_BN_CLICKED(id,memberfunction)和ON_COMMAND(id,memberfunction)是等同的。

(4)WM_NOTIFY消息只是對WM_COMMAND控件通知進行了擴展,與WM_COMMAND控件通知具有相同的特點。

SendMessage與PostMessage

PostMessage 把消息投遞到消息隊列后,立即返回; SendMessage把消息直接送到窗口過程處理,處理完才返回。

GetMessage與PeekMessage

GetMessage 有消息且該消息不為WM_QUIT,返回TRUE。              有消息且該消息為WM_QUIT,返回FALSE。                  沒有消息時,掛起該UI線程,控制權交還給系統。PeekMessage 有消息返回TRUE,如果沒有消息返回FALSE;不會阻塞。                   是否從消息隊列中刪除此消息(PM_REMOVE),由函數參數來指定。

要想在沒有消息時做一些工作,就必須使用PeekMessage來抓取消息,以便在沒有消息時,能在OnIdle中執行空閑操作(如下):

復制代碼復制代碼
 1 while (TRUE)  2 { 3     if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)  4     { 5         if (msg.message == WM_QUIT) 6             break; 7         TranslateMessage(&msg); 8         DispatchMessage(&msg); 9     }10     else 11     {12         OnIdle();13     }14 }復制代碼復制代碼

例如:MFC使用OnIdle函數來清理一些臨時對象及未使用的動態鏈接庫。

只有在OnIdle返回之后程序才能繼續處理用戶的輸入,因此不應在OnIdle進行較長的任務。

MFC消息處理

在CWnd中,MFC使用OnWndMsg來分別處理各類消息:

如果是WM_COMMAND消息,交給OnCommand處理;然后返回。

如果是WM_NOTIFY消息,交給OnNotify處理;然后返回。

如果是WM_ACTIVATE消息,先交給_AfxHandleActivate處理,再繼續下面的處理。

如果是WM_SETCURSOR消息,先交給_AfxHandleSetCursor處理,然后返回。

如果是其他的窗口消息(包括WM_ACTIVATE消息),則

  首先在消息緩沖池(一個hash表,用于加快消息處理函數的查找)進行消息匹配,    若匹配成功,則調用相應的消息處理函數;    若不成功,則在消息目標的消息映射數組中進行查找匹配,看它是否能處理當前消息。  如果消息目標處理了該消息,則會匹配到消息處理函數,調用它進行處理;

否則,該消息沒有被應用程序處理,OnWndMsg返回FALSE。

MFC消息映射

消息映射實際是MFC內建的一個消息分派機制。

把MFC中的宏進行展開(如下),可以得到消息映射表整個全貌。

注:GetMessageMap為虛函數。     {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}:對象消息映射表的結束標識

窗口消息只能由CWnd對象來處理,采用向基類直線上朔的方式,來查找對應的消息響應函數進行處理。

一旦找到消息響應函數(若有返回值且為TRUE),就停止上朔。因此,我們經常會看到這樣的代碼:

增加一個消息處理函數來寫我們的邏輯時,MFC ClassWizard會在該函數之前或之后顯示調用其基類對應的函數,保證基類中邏輯被執行。

命令消息可由CCmdTarget對象接收并處理(OnCmdMsg為虛函數),除了向基類直線上朔方式外,還有命令繞行機制(要防止形成圈,死循環)。

在某種程度上,控制通知消息由窗口對象處理是一種習慣和約定。然而,控件通知消息也是可以有CCmdTarget對象接收并處理,并進行命令繞行的。

下圖為MFC經典單文檔視圖框架的命令消息繞行路線:

函數調用過程如下(如果沒有任何對象處理該條WM_COMMAND消息,最后會被::DefWindowProc處理)。

非模態對話框的消息處理

1 static CAboutDlg aboutDlg;2 aboutDlg.Create(IDD_ABOUTBOX, this);3 aboutDlg.ShowWindow(SW_SHOW);

應用程序只有一個消息循環。

對于窗口消息,非模態對話框(及其子控件)與父窗口(及其子控件)都是用自身的WindowProc函數接收并處理,互不干擾。

對于命令消息,由當前活動主窗口的WindowProc接收(例如:當前活動主窗口為非模態對話框,則命令消息會被非模態對話框接收)。

可以在當前活動主窗口的OnCmdMsg中做命令繞行,使得其他的CCmdTarget對象也可以處理命令消息。

對于控件通知,由其父窗口的WindowProc接收并處理,一般不進行命令繞行被其他的CCmdTarget對象處理。

模態對話框的消息處理

1 CAboutDlg aboutDlg;2 aboutDlg.DoModal();

(1) 模態對話框彈出來后,首先會讓父窗口失效,使其不能接受用戶的輸入(鍵盤鼠標消息)。

1 EnableWindow(hwndParent, FALSE) ;

(2) 父窗口消息循環被阻塞(會卡在DoModal處,等待返回),由模態對話框的消息循環來接管(因此整個程序不會卡住)。

    接管后,模態對話框的消息循環仍然會將屬于父窗口及其子控件的窗口消息(不包括鍵盤鼠標相關的窗口消息)發送給它們各自的WindowProc窗口函數,進行響應處理。

(3) 模態對話框銷毀時(點擊IDOK或IDCANCEL),父窗口消息循環重新激活,繼續DoModal后的邏輯。

    激活后,父窗口有可以重新接受用戶的輸入(鍵盤鼠標消息)。

1 EnableWindow(hwndParent, TRUE) ;

從上面的過程中,我們可以得到如下結論:

對于窗口消息,模態對話框主窗口(及其子控件)與父窗口(及其子控件)都是用自身的WindowProc函數接收并處理,互不干擾。

只是父窗口(及其子控件)無法接受到鍵盤鼠標消息相關的窗口消息。

對于命令消息,由模態對話框主窗口的WindowProc接收。可以在模態對話框主窗口的OnCmdMsg中做命令繞行,使得其他的CCmdTarget對象也可以處理命令消息。

對于控件通知,由其父窗口的WindowProc接收并處理,一般不進行命令繞行被其他的CCmdTarget對象處理。

參考

《深入淺出MFC》- 侯捷

《MFC教程》- 消息映射的實現

http://blog.csdn.net/kongfuxionghao/article/details/35882533


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩欧美综合在线| 欧美日韩国产专区| 在线视频不卡国产V| av免费在线播放| 91精品国产色综合久久不卡蜜臀 | 日韩精品在线网站| 国产 日韩 欧美 综合| 日韩亚洲欧美中文在线| 国产一区精品在线| www.三级.com| 丰满少妇一区| 国产在线高清精品| 国产欧美久久久| 一区二区三区在线播放视频| 欧美中文字幕在线| 黄色一级大片在线免费看国产一| 亚洲欧洲综合另类| 欧美亚洲国产日韩2020| 精人妻一区二区三区| 黄色国产在线| 日韩中文字幕| 亚洲专区一二三| 日本不卡免费高清视频| 激情国产在线| 偷窥国产亚洲免费视频| 天堂在线一区二区三区| 一级片在线播放| 麻豆一区二区99久久久久| 亚洲福利视频专区| 免费视频二区| 中文字幕日韩欧美在线| 自拍日韩亚洲一区在线| 精品一性一色一乱农村| 欧美日韩国产中文精品字幕自在自线| 国产在线观看黄色| 日韩欧美在线精品| 中文字幕欧美国内| 日韩在线观看一区| 久久精品日韩无码| 精品久久久视频| 中文精品电影| 二区三区中文字幕| 日韩视频在线免费看| 免费精品国产自产拍观看| 国产一区成人| 国产综合精品在线| 国产福利不卡| 国产免费播放一区二区| 中文字幕亚洲乱码| 欧美日韩在线不卡一区| 色综合天天性综合| 国产成人一二三区| 欧美精品一区二区三区在线播放| 天天综合天天做| 欧美日韩在线第一页| av免费不卡国产观看| 日韩中文字幕亚洲| 五月综合激情日本mⅴ| 欧美激情视频一区二区三区在线播放| 日韩精品在线中文字幕| 欧美日韩在线第一页| 国产亚洲欧美色| 中文字幕在线视频日韩| 国产婷婷精品| 日韩在线视频免费观看高清中文| 亚洲一区在线观看网站| а√天堂中文在线资源8| 日韩精品视频在线播放| 婷婷精品视频| 亚洲成在线观看| 中文字幕日韩在线视频| 欧美三级日韩在线| 99视频精品全国免费| 中文字幕第一页在线播放| 国产拍揄自揄精品视频麻豆| 亚洲国内精品视频| 欧美日韩综合色| 日韩黄色在线播放| 亚洲福利一区| 中文字幕日韩在线观看| 欧美日韩高清在线| 日韩在线不卡| 日韩精品国产欧美| 视频一区二区精品的福利| 一级片免费在线| 国产高清在线视频| 1区2区3区在线视频| 日韩视频在线一区二区三区| 日韩欧美在线1卡| 91精品国产91久久久久久久久 | 91精品国产综合久久福利| 黄色片免费在线| 欧美久久久网站| 亚洲视频在线观看日本a | 中文字幕线观看| 日韩精品视频在线观看网址| 国产偷久久久精品专区| 亚洲一级影院| 中文字幕 欧美日韩| 日韩精品视频中文在线观看| 免费在线视频一级不卡| 在线视频不卡一区二区| 欧美不卡123| 欧美乱大交xxxxx另类| 日韩免费电影网站| 久久91精品视频| 日韩在线视频观看| 国产在线日韩欧美| 一区二区国产在线| 日韩在线视频精品| 99热最新网址| 欧美日本精品在线| 欧美日韩免费视频| 欧美日韩精品三区| 色综合天天性综合| 精品精品久久| 欧美日韩午夜在线视频| 国产高清精品二区| 精品国产网站在线观看| 一区在线免费| 欧美成人vr18sexvr| 日韩午夜一区| 免费在线亚洲| 日韩精品免费观看视频| √新版天堂资源在线资源| 国产对白在线| 美女黄a一级视频| 国产蜜臀在线| 日韩欧美综合在线| 久久99精品国产| 欧美三级日本三级少妇99| 日韩在线高清视频| 中文字幕伊人| 日韩av一区二区在线| 国产真实乱子伦精品视频| 国产网站欧美日韩免费精品在线观看| 中文字幕4区| 日韩视频免费直播| 欧美在线中文字幕| 免费精品国产自产拍在| 国产视频一区三区| 亚洲黄色www| 久久视频免费看| 一级片免费在线| 中文字幕日韩欧美在线视频| 精品一二三四区| 中文字幕成人乱码在线电影| 日本a口亚洲| 国产欧美日韩91| 精品人妻一区二区免费视频| 九九精品调教| 高清1区2区| 国产乱国产乱老熟300| 国产在线不卡av| 成人精品视频一区| 一区二区三区精品在线观看| 国产视频中文字幕| 1024国产在线| 欧美不卡视频一区发布| 欧美日韩国产不卡在线看| 亚洲一区在线观看视频| 玖玖在线免费视频| 一区二区不卡在线播放| 92久久精品| 精品一二三四区| 久久蜜桃精品| 中文字幕在线精品| 久久99久久久久| 一级片在线免费看| 一级日本免费的| 国产 日韩 欧美 综合| 精品日韩99亚洲| 日韩欧美亚洲区| 欧美日韩国产高清一区| 一区二区精品免费| 日韩亚洲一区在线| www..com日韩| 中文字幕国产亚洲| 中文字幕视频在线免费欧美日韩综合在线看| 一区二区三区在线免费| 国产小视频免费在线观看| 国产亚洲二区| 51精品免费网站| 欧美日韩亚洲第一| 日韩亚洲欧美中文三级| 欧美色欧美亚洲高清在线视频| 日韩精品在线视频| 久久91精品久久久久久秒播| 日韩你懂的电影在线观看| 欧美成人精品在线| 日韩国产成人| 欧美成人精品在线| 色综合天天综合网天天狠天天| 高清在线一区| 欧美日韩高清一区二区不卡| 精品国产99久久久久久| www.中文字幕在线| 97久久精品午夜一区二区| 日韩在线高清视频| 亚洲免费播放| 中文在线视频观看| 国产亚洲欧美色| 国产在线不卡av| 亚洲一区视频在线观看视频| 精品免费视频| 欧美日韩免费高清| 日韩在线高清视频| 精品国产99| 午夜高潮免费视频| 在线免费视频一区二区| 久久99久久99精品中文字幕| 中文字幕精品一区二| 午夜高潮免费视频| 黄色国产网站在线观看| 亚洲欧美日本另类| 中文字幕在线导航| 国产黄色在线看| 日韩欧美一级视频| 欧美一级日韩一级| 日韩欧美国产成人一区二区| 最新中文字幕在线| 欧美日韩在线视频一区| 91精品在线视频观看| 日韩不卡高清视频| 中文字幕欧美亚洲| 日韩免费视频一区二区| 国内精品不卡| 亚欧成人精品| 视频一区二区中文字幕| 一区精品在线播放| 精品熟女一区二区三区| 中文字幕欧美日韩精品| 久久精品99国产国产精| 精品福利一区二区三区| 欧美日韩国产免费观看| 午夜福利一区二区三区| 欧美日韩91| 最新中文字幕在线| 久久精品日韩无码| 91精品国产高清久久久久久| 日韩欧美亚洲视频| 91精品视频观看| 欧美日韩中文另类| 欧美日韩中文字幕在线观看| 欧美日韩国产成人| 欧美日韩精品欧美日韩精品| 亚洲一区二区三区精品中文字幕| av丝袜在线| 不卡专区在线| 欧美日韩国产高清| 二区中文字幕| 欧洲精品在线一区| 日韩精品视频免费看| 中文字幕第一页在线| 欧美一级欧美三级在线观看| 欧美日韩亚洲91| 国产视频1区2区| 中文字幕亚洲乱码| 国产欧美日韩中文字幕在线| 国产小视频在线| 国产欧美日韩综合精品| www在线视频| 一区二区三区视频网站| 一区二区三区在线免费| 欧美在线视频第一页| 黄色国产网站在线观看| 日韩欧美在线综合网| 欧美日韩夫妻久久| 国产高清在线一区| 国产欧美日韩在线播放| 国产最新在线| 韩国av一区二区| 国产欧美日韩中文| 国产三级在线| 亚洲综合在线视频| 97国产视频| 精品视频久久| 欧美一级日韩不卡播放免费| 亚洲大胆人体av| 黄色在线播放网站| 快she精品国产999| 久草亚洲一区| 国产视频不卡| 亚洲欧洲日韩在线| 久久91精品视频| 日韩精品手机在线观看| 日韩精品在线免费看| 精品国产999| 中文在线一区二区| 成人xxxx| √新版天堂资源在线资源| 精品熟女一区二区三区| 91av久久久| 国产视频二区| 在线看的av| 国产91久久久久蜜臀青青天草二 | 日韩在线高清| 99精品999| 欧美日韩精品久久久| 91久久中文| av手机天堂| av中文网站| 国产一卡2卡3卡四卡网站| 91精品国产91久久久久青草| 人成在线免费视频| 最近中文字幕在线中文视频| 中文字幕狠狠干| 国产一区不卡在线| 在线观看一区| 国产黄色高清在线| 欧美亚洲另类制服自拍| 中文字幕在线国产| 欧美日韩精品欧美日韩精品| 91精品婷婷国产综合久久| 欧美日韩国产影片| 久久夜色精品国产欧美乱极品| 日韩欧美国产不卡| 国产成人精品日本亚洲专区61| 亚洲高清免费一级二级三级| 国产久卡久卡久卡久卡视频精品| 国产免费久久| 国产99对白在线播放| 国产黄色小视频| 97最新国自产拍视频在线完整在线看| 亚洲精品中文字幕乱码三区不卡| 久久麻豆视频| 日韩欧美一级视频| 亚洲第一中文字幕| 欧美激情一区二区在线| 欧美日韩精品不卡| av首页在线| 日韩av一区二区在线| 亚洲国产福利视频| 欧美国产中文| 中文精品视频| 亚洲视频 中文字幕| 国产在线黄色片| 国产亚洲人成a一在线v站| 极品久久久久久| 欧美高清一区| 国产不卡的av| av免费在线观看网址| 精品一区二区三区中文字幕在线| 色综合天天综合网国产成人综合天| 亚洲欧美韩国综合色| 国产成人精品免费久久久久| 日韩视频一区| 欧美日韩精品欧美日韩精品| 日韩色在线观看| 国产黄色小视频| 欧美日韩精品免费| 日韩欧美在线不卡| 国产福利三区| 日韩欧美一级视频| 视频一区三区| 在线观看精品国产| 黄色一级大片在线免费看国产一| 亚洲第一中文字幕在线观看| 在线视频国产三级| 97国产视频| 91亚洲国产| 日韩美女视频一区二区在线观看| 欧美日韩在线精品成人综合网 | 亚洲一区资源| 天天综合天天添夜夜添狠狠添| 欧美日韩在线不卡一区| 欧美日韩999| 91久久精品国产91性色69| 在线视频一区二区三区在线播放 | 久本草在线中文字幕亚洲欧美| 日韩视频在线观看一区| 91精品999| 中文在线а√在线8| 亚洲欧美中文字幕| 亚洲视频电影在线| 欧美日韩精品国产| www.久久草| 黄色在线资源| 欧美日韩国产综合视频在线观看中文| 欧美日本精品在线| 日韩三级视频在线播放| 中文字幕高清在线播放| 精品网站999| 国产拍揄自揄精品视频麻豆| 欧美日韩中文国产| 欧美日韩在线观看首页| 一区二区精品| 91精品国产免费久久综合| 欧美日韩国产影片| av午夜在线| 欧美三级三级三级爽爽爽| 日韩欧美三级| 91精品久久久久久久久久| 91精品国产91久久久久久三级| 久久精品免费看| 中文字幕在线视频久| 91精品免费看| 国产一二三精品| 精品欧美不卡一区二区在线观看| 欧美日韩中文字幕一区|