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

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

?? mfc

?? 很好的MFC書籍
??
?? 第 1 頁 / 共 5 頁
字號:
  <P></P>
  <P 
  align=justify>如前所述,消息映射數組的元素是消息映射條目,條目的格式符合結構AFX_MESSAGE_ENTRY的描述。所以,要初始化消息映射數組,就必須使用符合該格式的數據來填充:如果指定當前類處理某個消息,則把和該消息有關的信息(四個)和消息處理函數的地址及原型組合成為一個消息映射條目,加入到消息映射數組中。</P>
  <P 
  align=justify>顯然,這是一個繁瑣的工作。為了簡化操作,MFC根據消息的不同和消息處理方式的不同,把消息映射劃分成若干類別,每一類的消息映射至少有一個共性:消息處理函數的原型相同。對每一類消息映射,MFC定義了一個宏來簡化初始化消息數組的工作。例如,前文提到的ON_COMMAND宏用來映射命令消息,只要指定命令ID和消息處理函數即可,因為對這類命令消息映射條目,其他四個屬性都是固定的。ON_COMMAND宏的初始化內容如下:</P>
  <P align=justify>{WM_COMMAND,</P>
  <P align=justify>CN_COMMAND,</P>
  <P align=justify>(WORD)ID_APP_ABOUT,</P>
  <P align=justify>(WORD)ID_APP_ABOUT,</P>
  <P align=justify>AfxSig_vv,</P>
  <P align=justify>(AFX_PMSG)OnAppAbout</P>
  <P align=justify>}</P>
  <P 
  align=justify>這個消息映射條目的含義是:消息ID是ID_APP_ABOUT,OnAppAbout被轉換成AFX_PMSG指針類型,AfxSig_vv是MFC預定義的枚舉變量,用來標識OnAppAbout的函數類型為參數空(Void)、返回空(Void)。</P>
  <P align=justify>在消息映射數組的最后,是宏END_MESSAGE_MAP的內容,它標識消息處理類的消息映射條目的終止。</P>
  <P align=justify></P>
  <LI>對messageMap的初始化 
  <P></P>
  <P align=justify>如前所述,messageMap的類型是AFX_MESSMAP。</P>
  <P align=justify>經過初始化,域lpEntries保存了消息映射數組_messageEntries的地址;如果動態鏈接到MFC 
  DLL,則pfnGetBaseMap保存了_GetBaseMessageMap成員函數的地址;否則pBaseMap保存了基類的消息映射數組的地址。</P>
  <P align=justify></P>
  <LI>對函數的實現 
  <P></P></LI></OL>
<P align=justify>_GetBaseMessageMap()</P>
<P align=justify>它返回基類的成員變量messagMap(當使用MFC DLL時),使用該函數得到基類消息映射入口表。</P>
<P align=justify></P>
<P align=justify>GetMessageMap():</P>
<P align=justify>它返回成員變量messageMap,使用該函數得到自身消息映射入口表。</P>
<P align=justify></P>
<P align=justify>順便說一下,消息映射類的基類CCmdTarget也實現了上述和消息映射相關的函數,不過,它的消息映射數組是空的。</P>
<P align=justify></P>
<P align=justify>既然消息映射宏方便了消息映射的實現,那么有必要詳細的討論消息映射宏。下一節,介紹消息映射宏的分類、用法和用途。</P>
<OL>
  <OL>
    <OL>
      <P align=justify>
      <LI><A name=_Toc445889013></A><A name=_Toc445782416></A><A 
      name=_Toc452640904></A><A name=_Toc457298972></A><B>消息映射宏的種類</B> 
      <P></P></LI></OL></OL></OL>
<P 
align=justify>為了簡化程序員的工作,MFC定義了一系列的消息映射宏和像AfxSig_vv這樣的枚舉變量,以及標準消息處理函數,并且具體地實現這些函數。這里主要討論消息映射宏,常用的分為以下幾類。</P>
<OL>
  <P align=justify>
  <LI>用于Windows消息的宏,前綴為“ON_WM_”。 
  <P></P>
  <P 
  align=justify>這樣的宏不帶參數,因為它對應的消息和消息處理函數的函數名稱、函數原型是確定的。MFC提供了這類消息處理函數的定義和缺省實現。每個這樣的宏處理不同的Windows消息。</P>
  <P 
  align=justify>例如:宏ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函數,消息映射條目的第一個成員nMessage指定為要處理的Windows消息的ID,第二個成員nCode指定為0。</P>
  <P align=justify></P>
  <LI>用于命令消息的宏ON_COMMAND 
  <P></P></LI></OL>
<P 
align=justify>這類宏帶有參數,需要通過參數指定命令ID和消息處理函數。這些消息都映射到WM_COMMAND上,也就是將消息映射條目的第一個成員nMessage指定為WM_COMMAND,第二個成員nCode指定為CN_COMMAND(即0)。消息處理函數的原型是void 
(void),不帶參數,不返回值。</P>
<P 
align=justify>除了單條命令消息的映射,還有把一定范圍的命令消息映射到一個消息處理函數的映射宏ON_COMMAND_RANGE。這類宏帶有參數,需要指定命令ID的范圍和消息處理函數。這些消息都映射到WM_COMMAND上,也就是將消息映射條目的第一個成員nMessage指定為WM_COMMAND,第二個成員nCode指定為CN_COMMAND(即0),第三個成員nID和第四個成員nLastID指定了映射消息的起止范圍。消息處理函數的原型是void 
(UINT),有一個UINT類型的參數,表示要處理的命令消息ID,不返回值。</P>
<P align=justify>(3)用于控制通知消息的宏</P>
<P 
align=justify>這類宏可能帶有三個參數,如ON_CONTROL,就需要指定控制窗口ID,通知碼和消息處理函數;也可能帶有兩個參數,如具體處理特定通知消息的宏ON_BN_CLICKED、ON_LBN_DBLCLK、ON_CBN_EDITCHANGE等,需要指定控制窗口ID和消息處理函數。</P>
<P 
align=justify>控制通知消息也被映射到WM_COMMAND上,也就是將消息映射條目的第一個成員的nMessage指定為WM_COMMAND,但是第二個成員nCode是特定的通知碼,第三個成員nID是控制子窗口的ID,第四個成員nLastID等于第三個成員的值。消息處理函數的原型是void 
(void),沒有參數,不返回值。</P>
<P 
align=justify>還有一類宏處理通知消息ON_NOTIFY,它類似于ON_CONTROL,但是控制通知消息被映射到WM_NOTIFY。消息映射條目的第一個成員的nMessage被指定為WM_NOTIFY,第二個成員nCode是特定的通知碼,第三個成員nID是控制子窗口的ID,第四個成員nLastID等于第三個成員的值。消息處理函數的原型是void 
(NMHDR*, LRESULT*),參數1是NMHDR指針,參數2是LRESULT指針,用于返回結果,但函數不返回值。</P>
<P 
align=justify>對應地,還有把一定范圍的控制子窗口的某個通知消息映射到一個消息處理函數的映射宏,這類宏包括ON__CONTROL_RANGE和ON_NOTIFY_RANGE。這類宏帶有參數,需要指定控制子窗口ID的范圍和通知消息,以及消息處理函數。</P>
<P 
align=justify>對于ON__CONTROL_RANGE,是將消息映射條目的第一個成員的nMessage指定為WM_COMMAND,但是第二個成員nCode是特定的通知碼,第三個成員nID和第四個成員nLastID等于指定了控制窗口ID的范圍。消息處理函數的原型是void 
(UINT),參數表示要處理的通知消息是哪個ID的控制子窗口發送的,函數不返回值。</P>
<P 
align=justify>對于ON__NOTIFY_RANGE,消息映射條目的第一個成員的nMessage被指定為WM_NOTIFY,第二個成員nCode是特定的通知碼,第三個成員nID和第四個成員nLastID指定了控制窗口ID的范圍。消息處理函數的原型是void 
(UINT, NMHDR*, 
LRESULT*),參數1表示要處理的通知消息是哪個ID的控制子窗口發送的,參數2是NMHDR指針,參數3是LRESULT指針,用于返回結果,但函數不返回值。</P>
<P align=justify>(4)用于用戶界面接口狀態更新的ON_UPDATE_COMMAND_UI宏</P>
<P 
align=justify>這類宏被映射到消息WM_COMMND上,帶有兩個參數,需要指定用戶接口對象ID和消息處理函數。消息映射條目的第一個成員nMessage被指定為WM_COMMAND,第二個成員nCode被指定為-1,第三個成員nID和第四個成員nLastID都指定為用戶接口對象ID。消息處理函數的原型是 
void (CCmdUI*),參數指向一個CCmdUI對象,不返回值。</P>
<P 
align=justify>對應地,有更新一定ID范圍的用戶接口對象的宏ON_UPDATE_COMMAND_UI_RANGE,此宏帶有三個參數,用于指定用戶接口對象ID的范圍和消息處理函數。消息映射條目的第一個成員nMessage被指定為WM_COMMAND,第二個成員nCode被指定為-1,第三個成員nID和第四個成員nLastID用于指定用戶接口對象ID的范圍。消息處理函數的原型是 
void (CCmdUI*),參數指向一個CCmdUI對象,函數不返回值。之所以不用當前用戶接口對象ID作為參數,是因為CCmdUI對象包含了有關信息。</P>
<P align=justify>(5)用于其他消息的宏</P>
<P 
align=justify>例如用于用戶定義消息的ON_MESSAGE。這類宏帶有參數,需要指定消息ID和消息處理函數。消息映射條目的第一個成員nMessage被指定為消息ID,第二個成員nCode被指定為0,第三個成員nID和第四個成員也是0。消息處理的原型是LRESULT 
(WPARAM, LPARAM),參數1和參數2是消息參數wParam和lParam,返回LRESULT類型的值。</P>
<P align=justify>(6)擴展消息映射宏</P>
<P 
align=justify>很多普通消息映射宏都有對應的擴展消息映射宏,例如:ON_COMMAND對應的ON_COMMAND_EX,ON_ONTIFY對應的ON_ONTIFY_EX,等等。擴展宏除了具有普通宏的功能,還有特別的用途。關于擴展宏的具體討論和分析,見4.4.3.2節。</P>
<P align=justify>作為一個總結,下表列出了這些常用的消息映射宏。</P>
<P align=center>表4-1 常用的消息映射宏</P>
<P align=left>
<TABLE cellSpacing=1 cellPadding=7 width=499 border=1>
  <TBODY>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>消息映射宏 </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>用途 </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_COMMAND </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把command message映射到相應的函數 </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_CONTROL </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把control notification 
      message映射到相應的函數。MFC根據不同的控制消息,在此基礎上定義了更具體的宏,這樣用戶在使用時就不需要指定通知代碼ID,如ON_BN_CLICKED。 
      </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_MESSAGE </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把user-defined message.映射到相應的函數 </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_REGISTERED_MESSAGE </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把registered user-defined 
      message映射到相應的函數,實際上nMessage等于0x0C000,nSig等于宏的消息參數。nSig的真實值為Afxsig_lwl。 
    </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_UPDATE_COMMAND_UI </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把user interface user update command message映射到相應的函數上。 
    </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_COMMAND_RANGE </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把一定范圍內的command IDs 映射到相應的函數上 </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_UPDATE_COMMAND_UI_RANGE </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把一定范圍內的user interface user update command 
      message映射到相應的函數上 </P></TD></TR>
  <TR>
    <TD vAlign=top width="41%">
      <P align=justify>ON_CONTROL_RANGE </P></TD>
    <TD vAlign=top width="59%">
      <P align=justify>把一定范圍內的control notification message映射到相應的函數上 
  </P></TD></TR></TBODY></TABLE>
<P></P>
<P align=justify></P>
<DIR>
<P align=justify>在表4-1中,宏ON_REGISTERED_MESSAGE的定義如下:</P></DIR>
<P align=justify>#define ON_REGISTERED_MESSAGE(nMessageVariable, memberFxn) 
\</P>
<P align=justify>{ 0xC000, 0, 0, 0,\</P>
<P align=justify>(UINT)(UINT*)(&amp;nMessageVariable), \</P>
<P align=justify>/*implied 'AfxSig_lwl'*/ \</P>
<P align=justify>(AFX_PMSG)(AFX_PMSGW)(LRESULT\</P>
<P align=justify>(AFX_MSG_CALL CWnd::*)\</P>
<P align=justify>(WPARAM, LPARAM))&amp;memberFxn }</P>
<P 
align=justify>從上面的定義可以看出,實際上,該消息被映射到WM_COMMAND(0XC000),指定的registered消息ID存放在nSig域內,nSig的值在這樣的映射條目下隱含地定為AfxSig_lwl。由于ID和正常的nSig域存放的值范圍不同,所以MFC可以判斷出是否是registered消息映射條目。如果是,則使用AfxSig_lwl把消息處理函數轉換成參數1為Word、參數2為long、返回值為long的類型。</P>
<P 
align=justify>在介紹完了消息映射的內幕之后,應該討論消息處理過程了。由于CCmdTarge的特殊性和重要性,在4.3節先對其作一個大略的介紹。</P>
<OL>
  <OL>
    <P align=justify>
    <LI><A name=_Toc445889014></A><A name=_Toc445782417></A><A 
    name=_Toc452640905></A><A name=_Toc457298973></A><B>CcmdTarget類</B> 
    <P></P></LI></OL></OL>
<P 
align=justify>除了CObject類外,還有一個非常重要的類CCmdTarget。所有響應消息或事件的類都從它派生。例如,CWinapp,CWnd,CDocument,CView,CDocTemplate,CFrameWnd,等等。</P>
<P 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内精品免费**视频| 美女在线一区二区| 久久久不卡网国产精品一区| 91精品在线免费| 欧美日韩www| 制服丝袜亚洲精品中文字幕| 欧美色偷偷大香| 欧美久久久久久蜜桃| 日韩亚洲欧美在线| 欧美体内she精高潮| 日韩西西人体444www| 国产亚洲1区2区3区| 日韩不卡手机在线v区| 久久99久久99精品免视看婷婷| 久久精工是国产品牌吗| 丁香桃色午夜亚洲一区二区三区| 国产一区在线观看视频| 成人黄色在线网站| 日韩国产欧美在线观看| 九色综合狠狠综合久久| 日本一区二区久久| 久久久久久久久久久久久女国产乱| 欧美一级xxx| 国产精品网站在线| 亚洲一区二区三区视频在线| 爽好久久久欧美精品| 精品在线播放午夜| 99re视频精品| 欧美日韩成人综合在线一区二区| 56国语精品自产拍在线观看| 精品粉嫩超白一线天av| 国产精品毛片久久久久久久| 一区二区三区欧美久久| 免费成人美女在线观看.| 99在线精品免费| 67194成人在线观看| 国产精品卡一卡二| 免费观看成人鲁鲁鲁鲁鲁视频| 成人福利在线看| 777亚洲妇女| 综合久久国产九一剧情麻豆| 免费黄网站欧美| 91色综合久久久久婷婷| 久久精品一区四区| 日韩精品一区第一页| 成人免费毛片片v| 日韩午夜小视频| 亚洲卡通动漫在线| 成人综合在线网站| 日韩欧美电影一区| 婷婷夜色潮精品综合在线| 成人精品国产福利| 国产丝袜欧美中文另类| 麻豆91免费看| 欧美精品第1页| 亚洲自拍偷拍图区| www.欧美日韩| 国产亚洲一区字幕| 国产真实乱对白精彩久久| 884aa四虎影成人精品一区| 亚洲精选在线视频| 成人av动漫在线| 久久久国产精品不卡| 中文字幕一区二区三区色视频| 国产电影精品久久禁18| 不卡的电影网站| 午夜私人影院久久久久| 国产精品天美传媒| 欧美日本精品一区二区三区| 国产成人免费xxxxxxxx| 亚洲午夜精品在线| 亚洲欧洲日产国码二区| 精品少妇一区二区三区免费观看 | 欧美日韩一级大片网址| 久久理论电影网| 日本人妖一区二区| 正在播放亚洲一区| 婷婷成人综合网| 日韩一区二区三区在线| 日韩成人精品视频| 欧美成人一区二区三区在线观看| 午夜天堂影视香蕉久久| 欧美亚洲精品一区| 亚洲韩国一区二区三区| 欧美日韩国产精品自在自线| 亚洲国产欧美在线| 91精品国产综合久久福利| 日韩国产欧美一区二区三区| 日韩精品一区二区在线观看| 国产一区在线观看视频| 国产精品久久久久桃色tv| www.欧美色图| 亚洲国产美女搞黄色| 欧美一区二区精品久久911| 精品一区二区三区久久久| 久久精品视频一区二区三区| 91麻豆6部合集magnet| 亚洲一区二区美女| 久久午夜国产精品| 色综合中文字幕国产 | 麻豆精品久久精品色综合| 日韩片之四级片| 国产成人午夜精品5599| 亚洲视频一二区| 欧美在线制服丝袜| 精品一区二区三区香蕉蜜桃 | 午夜欧美电影在线观看| 欧美成人三级在线| 成人黄色在线看| 亚洲图片自拍偷拍| www日韩大片| 在线观看日产精品| 激情文学综合插| 中文字幕一区二区三区四区| 69久久99精品久久久久婷婷| 成人做爰69片免费看网站| 一个色综合av| 欧美高清在线一区二区| 精品少妇一区二区三区在线视频 | 懂色av一区二区在线播放| 欧美成人三级在线| 日韩影院在线观看| 91精品欧美福利在线观看| 亚洲自拍偷拍九九九| 久久精品国产亚洲5555| 国产精品99久久不卡二区| 丝袜亚洲另类欧美| 国产日韩精品一区二区三区在线| 久久激情综合网| 国产欧美视频在线观看| 欧美一卡二卡在线| 欧美日韩中文字幕一区| 91在线观看一区二区| 午夜精品免费在线| 这里是久久伊人| 精品在线你懂的| 亚洲欧洲av色图| 色欧美片视频在线观看| 免费人成黄页网站在线一区二区 | 日韩一级完整毛片| 日韩高清在线一区| 一区二区三区不卡在线观看 | 亚洲精品一区二区三区福利| a亚洲天堂av| 一区二区高清免费观看影视大全| 欧美日韩国产乱码电影| 韩国女主播一区| 亚洲综合免费观看高清完整版| av高清不卡在线| 一区二区三区欧美激情| 久久久亚洲高清| 久久免费午夜影院| 日韩你懂的在线播放| 色屁屁一区二区| 91麻豆成人久久精品二区三区| 亚洲一区二区在线观看视频| 日本一区二区综合亚洲| 日韩欧美色电影| 色综合天天视频在线观看| 国产一区二区三区黄视频 | 26uuu精品一区二区在线观看| 国内精品嫩模私拍在线| 男人的天堂久久精品| 激情图片小说一区| 椎名由奈av一区二区三区| 欧美日韩高清一区二区不卡| 色综合天天视频在线观看| 国产成人精品www牛牛影视| 激情小说亚洲一区| 亚洲国产日韩av| 一区二区日韩av| 99这里都是精品| 久久精品日韩一区二区三区| 欧美一区二区三区在| 国产一区三区三区| 中文字幕制服丝袜一区二区三区| 国产精品网站在线观看| 国产精品国产三级国产有无不卡| 亚洲人被黑人高潮完整版| 亚洲小少妇裸体bbw| 亚洲成a人在线观看| 极品少妇xxxx精品少妇| av日韩在线网站| 在线播放视频一区| 久久毛片高清国产| 一区二区国产视频| 久久国产尿小便嘘嘘| 99久久精品久久久久久清纯| 欧美午夜免费电影| 久久精品男人的天堂| 伊人婷婷欧美激情| 久久se这里有精品| k8久久久一区二区三区| 制服视频三区第一页精品| 欧美激情一区二区| 婷婷激情综合网| caoporm超碰国产精品| 日韩欧美成人一区二区| 一区二区三区免费看视频| 国产揄拍国内精品对白|