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

系統(tǒng)理解Win32 API和MFC(下)

系統(tǒng)理解Win32 API和MFC(下)
作者: 溫昱
作者主頁: lcspace.diy.163.com

系統(tǒng)理解Win32 API和MFC(上)

二、MFC的概念模型

前面我們研究了WIN32 API的“領(lǐng)域模型”,對它有較全面的認(rèn)識。下面,對MFC概念模型的研究,我們把重點(diǎn)放在對app framework的研究上。
app framework中的message響應(yīng)/傳遞機(jī)制是最重要的。而Hook機(jī)制和Message響應(yīng)/傳遞機(jī)制是密切相關(guān)的,后者以前者為基礎(chǔ)。

1. Hook機(jī)制

也許有些程序員只知道hook機(jī)制可以編寫很“牛”的應(yīng)用,孰不知MFC本身也是依靠hook機(jī)制的。

從圖中看到,每個hook擁有一個指針隊(duì)列,每個指針指向一個稱為的HookProc函數(shù),HookProc將在合適的時機(jī)被OS調(diào)用執(zhí)行。hook是分不同種類的,其實(shí)正是hook的種類決定了它什么時機(jī)被OS調(diào)用執(zhí)行。提示,可以看一下“訂閱-發(fā)布”設(shè)計模式以助理解。

2 MFC中Message響應(yīng)函數(shù)的安裝

2.1 回憶API中Message響應(yīng)函數(shù)的安裝

API中Message響應(yīng)函數(shù)的安裝,是由CreateWindow()實(shí)現(xiàn)的,它將window與一個windowClass聯(lián)系起來,而后者中記錄了Message響應(yīng)函數(shù)的指針。
至于細(xì)節(jié),看一下如何用Win32 SDK或Win16 SDK寫程序就清楚了,其中 DefWindowProc()是API函數(shù),負(fù)責(zé)提供缺省的消息處理,所以,程序員只需要handle需要特殊處理的消息。

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
WNDCLASS wndclass;
...
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName = szWindowClass;
...
RegisterClass(&wndclass);
hWnd = CreateWindow( szWindowClass, ...);
...
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
...
return;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
2.2 MFC中Message響應(yīng)函數(shù)的安裝

MFC中Message響應(yīng)函數(shù)的安裝顯然更復(fù)雜,是在CWnd::CreateEx()被調(diào)用時完成的,其中還用到了Hook機(jī)制。

我們可以先猜一下MFC是怎么做的。MFC支持massage map,使得對消息的響應(yīng)份散到多個message handler函數(shù)中,而不是API開發(fā)是那種集中式的消息處理函數(shù);所以,想必會有專門的代碼來負(fù)責(zé)“檢索message map table然后調(diào)用message handle”。message map是為了支持程序員處理他關(guān)心的特殊message的,那么缺省的message處理邏輯在哪里呢?答案是MFC創(chuàng)建window obj時是用的“預(yù)定義的窗口類”,自然已經(jīng)有了缺省的message處理函數(shù)。

從圖中看到,CWnd有成員變量m_pfnSuper、成員變量m_hWnd、成員函數(shù)OnWndMsg()和成員函數(shù)DefWindowProc()。Wnd::OnWndMsg()負(fù)責(zé)“在message map中定義的message handle”能否處理到來的message,如果處理了要返回true;CWnd::DefWindowProc()負(fù)責(zé)對message缺省處理。
執(zhí)行過程是,首先CWnd::CreateEx()被調(diào)用,window obj和window class被相應(yīng)建立,此時window class的WindowProc字段存儲了預(yù)定義的缺省處理函數(shù)的地址;由于有hook在監(jiān)聽窗口創(chuàng)建消息,所以注冊的hookProc()會被調(diào)用執(zhí)行,它將classWindow數(shù)據(jù)結(jié)構(gòu)的WindowProc字段備份到CWnd::m_pfnSuper,再用SetWindowLong()改寫classWindow數(shù)據(jù)結(jié)構(gòu)的WindowProc字段為::AfxWndProc()的地址。當(dāng)任何一個message到達(dá)時,::AfxWndProc()被調(diào)用,至于它的邏輯,聰明的你一定猜到了,先調(diào)用Wnd::OnWndMsg(),如果返回值為false,還要調(diào)用CWnd::DefWindowProc(),CWnd::m_pfnSuper指向的缺省處理邏輯,也會在CWnd::DefWindowProc()中被調(diào)用。
提示,上面其實(shí)有多態(tài)情況發(fā)生。比如你可以在搜一下pWnd->WindowProc(nMsg, wParam, lParam); 另外,OnWndMsg和DefWindowProc都是CWnd類的虛擬函數(shù)。

要是覺得不太好理解,最好在VC++里創(chuàng)建一個project實(shí)際跟蹤一下,下面是我跟蹤時調(diào)用棧映象的截圖。


3. SubClass機(jī)制


從圖中看到,SubClass機(jī)制以CWnd自身的m_pfnSuper為基礎(chǔ),和“MFC中Message響應(yīng)函數(shù)的安裝”很象。

4.frame work中的主要相關(guān)類

frame work中的主要相關(guān)類 就是 message route的候選人,正是它們的OnCmdMsg()共同完成了message route,形成了chain of responsability模式。

5. frame work中的chain of responsability模式

下圖是一個對象樹,注意消息會在縱向和橫向兩個方向傳播。


消息在縱向方向上的傳遞,是在“上溯父類的massge map表”,MFC的message map完全是為了代替虛函數(shù)而采取的手段,而和message route無關(guān)。

消息在橫向方向上的傳遞,才是message route,才是chain of responsability模式,由多個相關(guān)類的OnCmdMsg()共同完成。

三、 總結(jié)
從上面的討論不難發(fā)現(xiàn),MFC中用到了不少設(shè)計模式,如上面提到的chain of responsability模式、composite模式和“訂閱-發(fā)布”模式。上面的討論不僅有助于程序員全面掌握Win32 API和MFC,對architect設(shè)計architecture也有很大幫助。

posted on 2008-11-01 15:38 wrh 閱讀(356) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

統(tǒng)計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧洲一区二区三区久久| 好吊色欧美一区二区三区视频| 亚洲黄色尤物视频| 免费永久网站黄欧美| 久久―日本道色综合久久| 午夜激情久久久| 欧美在线综合| 欧美mv日韩mv国产网站app| 亚洲丰满少妇videoshd| 亚洲清纯自拍| 亚洲一级一区| 久久久久久97三级| 欧美激情第一页xxx| 欧美吻胸吃奶大尺度电影| 国产乱码精品1区2区3区| 激情婷婷久久| 中国女人久久久| 久久精品亚洲精品| 亚洲人成网站在线播| 亚洲一区成人| 老司机精品福利视频| 欧美日韩免费一区二区三区视频 | 亚洲欧洲在线一区| 亚洲激情自拍| 久久久精品国产免费观看同学 | 欧美v日韩v国产v| 欧美视频一区| 黄色成人在线免费| 在线亚洲一区| 久久免费国产| 艳妇臀荡乳欲伦亚洲一区| 久久国产精品99国产精| 欧美日韩国产专区| 亚洲福利一区| 久久精品亚洲| 亚洲天堂第二页| 欧美精品电影| 亚洲国内自拍| 久久久国产一区二区三区| 亚洲精品在线视频| 裸体丰满少妇做受久久99精品| 国产精品福利在线| av不卡在线| 欧美成人精品在线| 久久xxxx| 国产又爽又黄的激情精品视频 | 午夜精品久久久久久久99黑人| 欧美二区在线| **网站欧美大片在线观看| 午夜精品一区二区三区在线播放| 欧美福利网址| 久久影音先锋| 精品96久久久久久中文字幕无| 欧美一区二区三区在线看| 一区二区久久| 欧美性猛交视频| 亚洲一区二区三区四区五区黄 | 国产日韩精品久久| 午夜欧美大片免费观看| 一本色道久久综合| 欧美日韩在线精品一区二区三区| 亚洲美女中文字幕| 亚洲国产欧美一区二区三区久久| 久久久久国产一区二区| 国内揄拍国内精品少妇国语| 欧美一区国产在线| 欧美伊人久久久久久午夜久久久久| 国产精品少妇自拍| 久久精品一区二区三区不卡| 午夜伦理片一区| 国产亚洲精品aa午夜观看| 欧美在线www| 久久精品中文字幕一区| 樱桃视频在线观看一区| 欧美激情亚洲精品| 欧美日韩一区二区三区在线| 日韩亚洲国产欧美| 亚洲日本欧美日韩高观看| 欧美激情第五页| 欧美精品久久久久久久久老牛影院 | 久久亚裔精品欧美| 久久久久久久国产| 日韩亚洲欧美精品| 亚洲无人区一区| 国产一区二区精品久久91| 老牛影视一区二区三区| 欧美v国产在线一区二区三区| 99re6这里只有精品视频在线观看| 亚洲欧洲一区二区三区在线观看| 欧美三级黄美女| 久久久精品国产免大香伊| 老司机免费视频一区二区三区| av成人免费在线| 欧美亚洲综合网| 一区二区欧美亚洲| 久久国产精品99精品国产| 一本色道久久综合| 久久精品人人| 亚洲伊人色欲综合网| 久久先锋影音| 亚洲欧美一区二区在线观看| 久久一区欧美| 欧美伊人影院| 欧美日韩黄色大片| 久久综合99re88久久爱| 欧美日本免费| 欧美成人a视频| 国产色视频一区| 99精品欧美| 日韩一区二区免费高清| 久久久视频精品| 久久久999精品免费| 欧美视频在线播放| 91久久午夜| 尤物网精品视频| 香蕉国产精品偷在线观看不卡| 一区二区三区鲁丝不卡| 久久亚洲图片| 久久亚洲美女| 国产午夜精品理论片a级大结局| 亚洲精品在线看| 亚洲精品影院在线观看| 久久亚洲美女| 快播亚洲色图| 黄色亚洲在线| 欧美在线精品一区| 久久黄色小说| 国产午夜亚洲精品不卡| 亚洲深夜影院| 一区二区三区日韩精品| 欧美全黄视频| 日韩午夜免费视频| 99精品国产在热久久婷婷| 美国成人毛片| 亚洲第一中文字幕| 亚洲人成久久| 欧美日韩成人免费| 欧美在线|欧美| 欧美视频在线观看视频极品| 亚洲国产99| 最新国产の精品合集bt伙计| 久久久91精品| 久热爱精品视频线路一| 精品成人在线观看| 久久嫩草精品久久久精品| 麻豆精品网站| 亚洲激情专区| 欧美极品在线视频| 一区二区三区日韩在线观看 | 亚洲成人在线视频网站| 久久人人97超碰精品888| 欧美成人午夜免费视在线看片| 亚洲高清一区二| 欧美精品久久久久久久| 宅男精品视频| 久久久久久久波多野高潮日日| 在线日韩精品视频| 欧美片网站免费| 亚洲免费在线视频一区 二区| 久久精品国产久精国产思思| 一区二区三区中文在线观看 | 久久九九热re6这里有精品| 欧美在线播放高清精品| 美国十次成人| 一本大道av伊人久久综合| 欧美日韩精品一区视频| 亚洲欧美日韩一区二区在线| 久久米奇亚洲| 亚洲狼人综合| 国产区精品在线观看| 蜜桃精品久久久久久久免费影院| 亚洲精品在线视频观看| 久久久久久久波多野高潮日日| 亚洲伦理一区| 国产午夜精品一区二区三区视频| 欧美成人免费小视频| 亚洲欧美www| 91久久久久久| 久久免费视频一区| 中文亚洲欧美| 在线观看欧美视频| 欧美三级黄美女| 免费在线国产精品| 欧美影院精品一区| 亚洲理论在线观看| 免费在线一区二区| 欧美一区二区三区四区高清 | 久久久久久尹人网香蕉| 99re66热这里只有精品3直播| 久久久久88色偷偷免费| 一区二区三区免费看| 亚洲成色777777女色窝| 国产精品一卡| 欧美日韩国产高清视频| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲欧美一区二区在线观看| 亚洲黄色av一区| 蜜桃av噜噜一区| 亚洲欧美中文另类| 正在播放欧美视频|