亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfc

?? 很好的MFC書籍
??
?? 第 1 頁 / 共 5 頁
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc4.php -->
<HTML><HEAD><TITLE>MFC教程_ 消息映射的實現</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3132" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<OL start=4>
  <P align=justify>
  <LI><A name=_Toc445888998></A><A name=_Toc445782401></A><A 
  name=_Toc452640897></A><A name=_Toc457298962></A><B>消息映射的實現</B> 
  <P></P>
  <OL>
    <P align=justify>
    <LI><B><A name=_Toc445888999></A><A name=_Toc445782402></A><A 
    name=_Toc452640898></A><A name=_Toc457298963></A>Windows消息概述</B> 
    <P></P>
    <P 
    align=justify>Windows應用程序的輸入由Windows系統以消息的形式發送給應用程序的窗口。這些窗口通過窗口過程來接收和處理消息,然后把控制返還給Windows。</P>
    <OL>
      <P align=justify>
      <LI><A name=_Toc457298964></A><B>消息的分類</B> 
      <P></P></LI></OL></LI></OL></LI></OL>
<OL>
  <P align=justify>
  <LI>隊列消息和非隊列消息 
  <P></P>
  <P 
  align=justify>從消息的發送途徑上看,消息分兩種:隊列消息和非隊列消息。隊列消息送到系統消息隊列,然后到線程消息隊列;非隊列消息直接送給目的窗口過程。</P>
  <P align=justify>這里,對消息隊列闡述如下:</P>
  <P align=justify>Windows維護一個系統消息隊列(System message 
  queue),每個GUI線程有一個線程消息隊列(Thread message queue)。</P>
  <P 
  align=justify>鼠標、鍵盤事件由鼠標或鍵盤驅動程序轉換成輸入消息并把消息放進系統消息隊列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次從系統消息隊列移走一個消息,確定它是送給哪個窗口的和這個窗口是由哪個線程創建的,然后,把它放進窗口創建線程的線程消息隊列。線程消息隊列接收送給該線程所創建窗口的消息。線程從消息隊列取出消息,通過Windows把它送給適當的窗口過程來處理。</P>
  <P align=justify>除了鍵盤、鼠標消息以外,隊列消息還有WM_PAINT、WM_TIMER和WM_QUIT。</P>
  <P align=justify>這些隊列消息以外的絕大多數消息是非隊列消息。</P>
  <P align=justify></P>
  <LI>系統消息和應用程序消息 
  <P></P></LI></OL>
<P align=justify>從消息的來源來看,可以分為:系統定義的消息和應用程序定義的消息。</P>
<P 
align=justify>系統消息ID的范圍是從0到WM_USER-1,或0X80000到0XBFFFF;應用程序消息從WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范圍的消息由應用程序自己使用;0XC000到0XFFFF范圍的消息用來和其他應用程序通信,為了ID的唯一性,使用::RegisterWindowMessage來得到該范圍的消息ID。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc457298965></A><B>消息結構和消息處理</B> 
      <P></P></LI></OL></OL></OL>
<OL>
  <P align=justify>
  <LI><A name=_Toc445889001></A><A name=_Toc445782404></A>消息的結構 
  <P></P>
  <P 
  align=justify>為了從消息隊列獲取消息信息,需要使用MSG結構。例如,::GetMessage函數(從消息隊列得到消息并從隊列中移走)和::PeekMessage函數(從消息隊列得到消息但是可以不移走)都使用了該結構來保存獲得的消息信息。</P>
  <P align=justify>MSG結構的定義如下:</P>
  <P align=justify>typedef struct tagMSG { // msg </P>
  <P align=justify>HWND hwnd; </P>
  <P align=justify>UINT message; </P>
  <P align=justify>WPARAM wParam; </P>
  <P align=justify>LPARAM lParam; </P>
  <P align=justify>DWORD time; </P>
  <P align=justify>POINT pt; </P>
  <P align=justify>} MSG; </P>
  <P align=justify>該結構包括了六個成員,用來描述消息的有關屬性:</P>
  <P align=justify>接收消息的窗口句柄、消息標識(ID)、第一個消息參數、第二個消息參數、消息產生的時間、消息產生時鼠標的位置。</P>
  <P align=justify></P>
  <LI><A name=_Toc445889002><A name=_Toc445782405>應用程序通過窗口過程來處理消息</A></A> 
  <P></P>
  <P align=justify>如前所述,每個“窗口類”都要登記一個如下形式的窗口過程:</P>
  <P align=justify>LRESULT CALLBACK MainWndProc (</P>
  <P align=justify>HWND hwnd,// 窗口句柄</P>
  <P align=justify>UINT msg,// 消息標識</P>
  <P align=justify>WPARAM wParam,//消息參數1</P>
  <P align=justify>LPARAM lParam//消息參數2</P>
  <P align=justify>)</P>
  <P 
  align=justify>應用程序通過窗口過程來處理消息:非隊列消息由Windows直接送給目的窗口的窗口過程,隊列消息由::DispatchMessage等派發給目的窗口的窗口過程。窗口過程被調用時,接受四個參數:</P>
  <P align=justify>a window handle(窗口句柄);</P>
  <P align=justify>a message identifier(消息標識);</P>
  <P align=justify>two 32-bit values called message parameters(兩個32位的消息參數);</P>
  <P 
  align=justify>需要的話,窗口過程用::GetMessageTime獲取消息產生的時間,用::GetMessagePos獲取消息產生時鼠標光標所在的位置。</P>
  <P align=justify>在窗口過程里,用switch/case分支處理語句來識別和處理消息。</P>
  <P align=justify></P>
  <LI><A name=_Toc445889003><A name=_Toc445782406>應用程序通過消息循環來獲得對消息的處理</A></A> 
  <P></P>
  <P align=justify>每個GDI應用程序在主窗口創建之后,都會進入消息循環,接受用戶輸入、解釋和處理消息。</P>
  <P align=justify>消息循環的結構如下:</P>
  <P align=justify>while (GetMessage(&amp;msg, (HWND) NULL, 0, 0)) 
  {//從消息隊列得到消息</P>
  <P align=justify>if (hwndDlgModeless == (HWND) NULL || </P>
  <P align=justify>!IsDialogMessage(hwndDlgModeless, &amp;msg) &amp;&amp; </P>
  <P align=justify>!TranslateAccelerator(hwndMain, haccel, &amp;msg)) { </P>
  <P align=justify>TranslateMessage(&amp;msg); </P>
  <P align=justify>DispatchMessage(&amp;msg); //發送消息</P>
  <P align=justify>} </P>
  <P align=justify>}</P>
  <P>消息循環從消息隊列中得到消息,如果不是快捷鍵消息或者對話框消息,就進行消息轉換和派發,讓目的窗口的窗口過程來處理。</P>
  <P>當得到消息WM_QUIT,或者::GetMessage出錯時,退出消息循環。</P>
  <P align=justify></P>
  <LI>MFC消息處理 
  <P></P></LI></OL>
<P 
align=justify>使用MFC框架編程時,消息發送和處理的本質也如上所述。但是,有一點需要強調的是,所有的MFC窗口都使用同一窗口過程,程序員不必去設計和實現自己的窗口過程,而是通過MFC提供的一套消息映射機制來處理消息。因此,MFC簡化了程序員編程時處理消息的復雜性。</P>
<P 
align=justify>所謂消息映射,簡單地講,就是讓程序員指定要某個MFC類(有消息處理能力的類)處理某個消息。MFC提供了工具ClassWizard來幫助實現消息映射,在處理消息的類中添加一些有關消息映射的內容和處理消息的成員函數。程序員將完成消息處理函數,實現所希望的消息處理能力。</P>
<P>如果派生類要覆蓋基類的消息處理函數,就用ClassWizard在派生類中添加一個消息映射條目,用同樣的原型定義一個函數,然后實現該函數。這個函數覆蓋派生類的任何基類的同名處理函數。</P>
<P align=justify></P>
<P 
align=justify>下面幾節將分析MFC的消息機制的實現原理和消息處理的過程。為此,首先要分析ClassWizard實現消息映射的內幕,然后討論MFC的窗口過程,分析MFC窗口過程是如何實現消息處理的。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889004></A><A name=_Toc445782407></A><A 
    name=_Toc452640900></A><A name=_Toc457298966></A><B>消息映射的定義和實現</B> 
    <P></P>
    <OL>
      <P align=justify>
      <LI><B><A name=_Toc445889005></A><A name=_Toc445782408></A><A 
      name=_Toc452640901></A><A name=_Toc457298967></A>MFC處理的三類消息</B> 
      <P></P></LI></OL></LI></OL></OL>
<P align=justify>根據處理函數和處理過程的不同,MFC主要處理三類消息:</P>
<UL>
  <P align=justify>
  <LI>Windows消息,前綴以“WM_”打頭,WM_COMMAND例外。Windows消息直接送給MFC窗口過程處理,窗口過程調用對應的消息處理函數。一般,由窗口對象來處理這類消息,也就是說,這類消息處理函數一般是MFC窗口類的成員函數。 

  <P></P>
  <P align=justify></P>
  <LI>控制通知消息,是控制子窗口送給父窗口的WM_COMMAND通知消息。窗口過程調用對應的消息處理函數。一般,由窗口對象來處理這類消息,也就是說,這類消息處理函數一般是MFC窗口類的成員函數。 

  <P></P></LI></UL>
<P 
align=justify>需要指出的是,Win32使用新的WM_NOFITY來處理復雜的通知消息。WM_COMMAND類型的通知消息僅僅能傳遞一個控制窗口句柄(lparam)、控制窗ID和通知代碼(wparam)。WM_NOTIFY能傳遞任意復雜的信息。</P>
<UL>
  <P align=justify>
  <LI>命令消息,這是來自菜單、工具條按鈕、加速鍵等用戶接口對象的WM_COMMAND通知消息,屬于應用程序自己定義的消息。通過消息映射機制,MFC框架把命令按一定的路徑分發給多種類型的對象(具備消息處理能力)處理,如文檔、窗口、應用程序、文檔模板等對象。能處理消息映射的類必須從CCmdTarget類派生。 

  <P></P></LI></UL>
<P align=justify>在討論了消息的分類之后,應該是討論各類消息如何處理的時候了。但是,要知道怎么處理消息,首先要知道如何映射消息。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445889006></A><A name=_Toc445782409></A><A 
      name=_Toc452640902></A><A name=_Toc457298968></A><B>MFC消息映射的實現方法</B> 
      <P></P>
      <P 
      align=justify>MFC使用ClassWizard幫助實現消息映射,它在源碼中添加一些消息映射的內容,并聲明和實現消息處理函數。現在來分析這些被添加的內容。</P>
      <P 
      align=justify>在類的定義(頭文件)里,它增加了消息處理函數聲明,并添加一行聲明消息映射的宏DECLARE_MESSAGE_MAP。</P>
      <P 
      align=justify>在類的實現(實現文件)里,實現消息處理函數,并使用IMPLEMENT_MESSAGE_MAP宏實現消息映射。一般情況下,這些聲明和實現是由MFC的ClassWizard自動來維護的。看一個例子:</P>
      <P align=justify>在AppWizard產生的應用程序類的源碼中,應用程序類的定義(頭文件)包含了類似如下的代碼:</P>
      <P align=justify>//{{AFX_MSG(CTttApp)</P>
      <P align=justify>afx_msg void OnAppAbout();</P>
      <P align=justify>//}}AFX_MSG</P>
      <P align=justify>DECLARE_MESSAGE_MAP()</P>
      <P align=justify></P>
      <P align=justify>應用程序類的實現文件中包含了類似如下的代碼:</P>
      <P align=justify>BEGIN_MESSAGE_MAP(CTApp, CWinApp)</P>
      <P align=justify>//{{AFX_MSG_MAP(CTttApp)</P>
      <P align=justify>ON_COMMAND(ID_APP_ABOUT, OnAppAbout)</P>
      <P align=justify>//}}AFX_MSG_MAP</P>
      <P align=justify>END_MESSAGE_MAP()</P>
      <P align=justify></P>
      <P 
      align=justify>頭文件里是消息映射和消息處理函數的聲明,實現文件里是消息映射的實現和消息處理函數的實現。它表示讓應用程序對象處理命令消息ID_APP_ABOUT,消息處理函數是OnAppAbout。</P>
      <P align=justify>為什么這樣做之后就完成了一個消息映射?這些聲明和實現到底作了些什么呢?接著,將討論這些問題。</P>
      <P align=justify></P>
      <LI><A name=_Toc445889007></A><A name=_Toc445782410></A><A 
      name=_Toc452640903></A><A name=_Toc457298969></A><B>在聲明與實現的內部</B> 
      <P></P></LI></OL></OL></OL>
<OL>
  <P align=justify>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美老女人在线| 中文字幕二三区不卡| 亚洲激情六月丁香| 国产精品99久久久久久似苏梦涵 | 日韩理论片在线| 成年人国产精品| 中文字幕制服丝袜一区二区三区 | 美国一区二区三区在线播放| 色狠狠综合天天综合综合| 亚洲少妇最新在线视频| 色哟哟国产精品免费观看| 亚洲人成网站在线| 色一情一乱一乱一91av| 天天做天天摸天天爽国产一区| 欧洲精品中文字幕| 亚洲高清视频在线| 7777精品伊人久久久大香线蕉的 | 男女视频一区二区| 日韩欧美国产系列| 国产一区91精品张津瑜| 国产精品家庭影院| 色综合天天狠狠| 蜜桃久久av一区| 久久久夜色精品亚洲| 丰满亚洲少妇av| 亚洲在线一区二区三区| 欧美日韩国产高清一区二区| 日本少妇一区二区| 欧美激情一区二区| 欧美在线不卡视频| 国产激情视频一区二区三区欧美| 国产亚洲女人久久久久毛片| 91麻豆蜜桃一区二区三区| 亚洲激情男女视频| 精品精品国产高清a毛片牛牛| 丁香激情综合国产| 亚洲综合一区在线| 久久综合久久综合亚洲| 99re这里只有精品视频首页| 性欧美疯狂xxxxbbbb| 国产视频视频一区| 日韩一区二区在线看| 国产精品1区2区3区在线观看| 亚洲区小说区图片区qvod| 日韩欧美综合一区| 色网站国产精品| 国产精品资源网| 亚洲一区二区综合| 精品粉嫩超白一线天av| 在线电影院国产精品| 国产成人av在线影院| 丝袜脚交一区二区| 国产精品天美传媒沈樵| 久久麻豆一区二区| 91精品国产麻豆| 色婷婷激情综合| 美国欧美日韩国产在线播放| 午夜精品福利一区二区蜜股av| 欧美激情综合网| 中文在线资源观看网站视频免费不卡 | 亚洲超碰精品一区二区| 国产精品久久久久久久久免费相片 | 久久99国产精品免费| 国产精品色噜噜| 日韩三级av在线播放| 一本大道av一区二区在线播放| 国产伦精品一区二区三区免费| 亚洲人成亚洲人成在线观看图片| 久久久美女毛片| 欧美一级二级在线观看| 欧美日韩五月天| 99re视频这里只有精品| 国产精品自拍三区| 精品在线视频一区| 天堂蜜桃一区二区三区| 一区二区三区中文字幕| 91精品蜜臀在线一区尤物| 制服.丝袜.亚洲.中文.综合| 色一情一伦一子一伦一区| 成人小视频免费观看| 波波电影院一区二区三区| 99国产精品久久久久久久久久久| www.爱久久.com| 91在线视频免费91| 91精品福利视频| 欧美色综合影院| 91麻豆精品国产91久久久更新时间| 欧美日韩在线三级| 欧美精品自拍偷拍| 日韩欧美aaaaaa| 久久久久国产精品厨房| 国产欧美精品国产国产专区| 亚洲国产高清aⅴ视频| 成人免费视频在线观看| 亚洲美女精品一区| 日韩精品每日更新| 狠狠狠色丁香婷婷综合激情| 国产成人av资源| 欧美日韩在线三区| 日韩欧美色电影| 中日韩av电影| 麻豆国产精品视频| 国产成人综合在线| 91蜜桃在线免费视频| 91麻豆精品国产自产在线观看一区 | 又紧又大又爽精品一区二区| 亚洲国产一区二区三区| 精品一区二区三区香蕉蜜桃| 91丨九色porny丨蝌蚪| 欧美日韩一区二区三区免费看| 欧美成人性福生活免费看| 国产精品美女视频| 青青草国产成人av片免费| 顶级嫩模精品视频在线看| 欧美午夜电影一区| 久久久久国产一区二区三区四区 | 亚洲国产岛国毛片在线| 亚洲成av人片在线| 国产大陆亚洲精品国产| 欧美日韩免费观看一区三区| 久久久久久久综合色一本| 亚洲综合另类小说| 国产激情视频一区二区在线观看 | 精品一区二区精品| 色婷婷精品大视频在线蜜桃视频| 欧美大片拔萝卜| 夜夜揉揉日日人人青青一国产精品| 激情综合网激情| 欧美性猛交xxxx黑人交| 欧美激情一区二区三区| 精品在线免费视频| 欧美日本韩国一区二区三区视频| 久久久综合视频| 日本最新不卡在线| 欧美艳星brazzers| 国产精品视频你懂的| 麻豆一区二区99久久久久| 在线视频综合导航| 日本一区二区三级电影在线观看| 视频一区国产视频| 色av一区二区| 国产精品国产三级国产aⅴ无密码| 免费观看在线色综合| 色噜噜狠狠成人网p站| 国产精品视频第一区| 国产一区二区三区最好精华液| 欧美三电影在线| 一区二区三区精密机械公司| 成av人片一区二区| 欧美国产国产综合| 狠狠色伊人亚洲综合成人| 9191成人精品久久| 蜜芽一区二区三区| 国产日韩三级在线| 久久国产人妖系列| 国产高清视频一区| 欧美精品一区二| 国内不卡的二区三区中文字幕| 欧美精品xxxxbbbb| 懂色av一区二区三区蜜臀| 久久久久久久久免费| av爱爱亚洲一区| 欧美中文字幕久久| 午夜伊人狠狠久久| 久久九九国产精品| aa级大片欧美| 国产一区二区成人久久免费影院| 日韩三级视频中文字幕| 懂色av一区二区三区免费观看| 1区2区3区国产精品| 欧美高清性hdvideosex| 国产iv一区二区三区| 日韩精品一二区| 国产精品高潮呻吟久久| 亚洲人吸女人奶水| 色综合久久88色综合天天免费| 亚洲欧美日韩国产综合| 91麻豆精东视频| 樱花草国产18久久久久| 欧洲精品在线观看| 无码av免费一区二区三区试看| 884aa四虎影成人精品一区| 亚洲大尺度视频在线观看| 8v天堂国产在线一区二区| 久久国产成人午夜av影院| 精品粉嫩aⅴ一区二区三区四区| 久久疯狂做爰流白浆xx| 国产色产综合产在线视频| 国产91丝袜在线18| 亚洲欧洲美洲综合色网| 欧美三级三级三级| 免费观看91视频大全| 久久久久久久免费视频了| 国产成人a级片| 亚洲自拍偷拍综合| 日韩美一区二区三区| 成人网在线播放| 亚洲成av人影院| 欧美国产一区视频在线观看| 色哟哟亚洲精品|