亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
91视频在线看| 精品一区二区综合| 丝袜脚交一区二区| 久草这里只有精品视频| av不卡在线观看| 欧美视频在线播放| 欧美视频一区在线观看| 欧美日韩免费视频| 日本一区二区久久| 激情亚洲综合在线| 一本在线高清不卡dvd| 久久久蜜臀国产一区二区| 日韩vs国产vs欧美| 欧美色视频一区| 亚洲一区二区三区四区中文字幕| 国产日韩欧美电影| 亚洲精品一区二区三区福利| 亚洲永久精品国产| 国产欧美一区二区在线| 国产欧美一区在线| 国产91精品一区二区麻豆亚洲| 久久精品一区二区| 色婷婷综合在线| 欧美高清在线一区| 精品综合久久久久久8888| 色综合天天综合色综合av| 久久久久久久久岛国免费| 日韩黄色免费电影| 日韩写真欧美这视频| 精品久久久久久久久久久久包黑料| 亚洲男同性视频| 风间由美一区二区av101| 精品国产欧美一区二区| 日本午夜精品一区二区三区电影 | 成人性生交大合| 精品国产一区二区三区四区四| 偷拍日韩校园综合在线| 欧美片在线播放| 亚洲成国产人片在线观看| 在线观看视频一区| 日韩国产欧美在线视频| 欧美日韩高清影院| 三级在线观看一区二区| 欧美高清视频在线高清观看mv色露露十八| 亚洲综合精品久久| 欧美巨大另类极品videosbest | 成人h动漫精品| 亚洲综合精品久久| 久久久精品黄色| 91福利在线播放| 国产黄色精品网站| 国产亚洲精品aa| 色综合天天综合给合国产| 天天影视网天天综合色在线播放| 欧美高清视频www夜色资源网| 国产美女娇喘av呻吟久久| 中文字幕在线不卡视频| 欧美日韩黄色影视| 99精品久久久久久| 天天色天天爱天天射综合| 中文字幕乱码日本亚洲一区二区| 欧美性生活久久| 成人一二三区视频| 精品一区二区三区免费视频| 一区二区三区在线观看欧美| 国产亚洲精品aa午夜观看| 欧美日韩精品一区二区三区蜜桃| 国产盗摄一区二区| 久久99最新地址| 青青国产91久久久久久| 无吗不卡中文字幕| 午夜激情综合网| 亚洲愉拍自拍另类高清精品| 久久午夜色播影院免费高清| 欧美日韩久久久| 欧美丝袜丝nylons| 色哟哟亚洲精品| 色综合激情五月| 欧美久久久久久久久久| 欧美日韩情趣电影| 国产日产精品1区| 成人欧美一区二区三区在线播放| 久久九九久精品国产免费直播| 国产午夜精品久久| 亚洲一区影音先锋| 日韩和的一区二区| 国产精品中文字幕一区二区三区| 国产自产高清不卡| 成人黄动漫网站免费app| 在线看日本不卡| 宅男噜噜噜66一区二区66| 欧美精品色综合| 国产亚洲短视频| 亚洲亚洲人成综合网络| 男人的j进女人的j一区| 国产精品一区不卡| 欧美美女黄视频| 国产午夜一区二区三区| 亚洲欧美另类小说视频| 麻豆久久一区二区| 成人午夜短视频| 777亚洲妇女| 亚洲男女一区二区三区| 开心九九激情九九欧美日韩精美视频电影 | 国产亚洲精品aa| 日本成人超碰在线观看| www.日韩在线| 久久久亚洲综合| 久久99精品久久久久久动态图| www.欧美日韩国产在线| 91精品国产一区二区人妖| 国产精品久久久99| 国产伦精品一区二区三区视频青涩| 日本精品免费观看高清观看| 久久久一区二区| 久久99精品久久久久久国产越南 | 日本美女一区二区| 欧美伊人久久大香线蕉综合69| 久久久午夜精品| 国产成人免费视频精品含羞草妖精| 欧美久久久久久久久| 午夜精品国产更新| 欧美日韩精品三区| 同产精品九九九| 日韩欧美一区在线观看| 性做久久久久久免费观看| 欧美在线色视频| 日本在线不卡一区| 欧美精品一区二区三区一线天视频 | 日本丶国产丶欧美色综合| 久久国产视频网| 欧美一区二区精品在线| 久久激情五月激情| 国产精品久久久久婷婷二区次| 成人爱爱电影网址| 亚洲一区二区三区三| 欧美绝品在线观看成人午夜影视| 日本在线播放一区二区三区| 久久综合丝袜日本网| 91麻豆国产自产在线观看| 亚洲自拍与偷拍| 欧美成人免费网站| 成人听书哪个软件好| 久久久久99精品国产片| 欧美三级三级三级爽爽爽| 美女性感视频久久| 国产精品久久久久久福利一牛影视| 91精彩视频在线| 国产激情视频一区二区在线观看 | 欧美精品免费视频| 国产成人在线视频网址| 亚洲高清免费视频| 国产欧美日产一区| 日韩一级二级三级| 欧美视频你懂的| 成人国产在线观看| 国产乱码精品一区二区三区五月婷| 一区二区三区国产精品| 国产亚洲一区二区三区在线观看| 欧美老肥妇做.爰bbww| 91视频在线观看| 99精品久久99久久久久| 丰满放荡岳乱妇91ww| 免费日韩伦理电影| 男女男精品视频网| 奇米精品一区二区三区在线观看| 亚洲国产一区在线观看| 亚洲免费在线观看| 亚洲日本丝袜连裤袜办公室| 国产女人18毛片水真多成人如厕| 精品美女被调教视频大全网站| 欧美一区二区网站| 欧美大尺度电影在线| 欧美一区二区在线播放| 91精品国产麻豆国产自产在线| 欧美日韩免费一区二区三区视频 | 亚洲欧美成aⅴ人在线观看| 亚洲日本青草视频在线怡红院| 中文字幕一区二区5566日韩| 亚洲欧美偷拍卡通变态| 亚洲曰韩产成在线| 麻豆精品视频在线| 国产一区二区女| 91免费看`日韩一区二区| 色噜噜狠狠成人中文综合 | 亚洲综合激情另类小说区| 另类小说色综合网站| 大桥未久av一区二区三区中文| 色综合亚洲欧洲| 91精品国产麻豆国产自产在线 | 国产成人av网站| 欧美日韩在线播| 中文幕一区二区三区久久蜜桃| 亚洲欧美另类图片小说| 国产一区激情在线| 在线播放视频一区| 一区二区三区欧美在线观看| 老司机精品视频一区二区三区| 色婷婷激情综合| 成人欧美一区二区三区小说|