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

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

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

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

二、MFC的概念模型

前面我們研究了WIN32 API的“領域模型”,對它有較全面的認識。下面,對MFC概念模型的研究,我們把重點放在對app framework的研究上。
app framework中的message響應/傳遞機制是最重要的。而Hook機制和Message響應/傳遞機制是密切相關的,后者以前者為基礎。

1. Hook機制

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

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

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

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

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

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

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

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

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


3. SubClass機制


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

4.frame work中的主要相關類

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

5. frame work中的chain of responsability模式

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


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

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

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

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


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


導航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統(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>
            亚洲大黄网站| 亚洲人成人一区二区三区| 欧美三级免费| 蜜乳av另类精品一区二区| 西西裸体人体做爰大胆久久久| 亚洲精品欧美日韩专区| 亚洲激情社区| 艳妇臀荡乳欲伦亚洲一区| 亚洲精品在线三区| 在线视频欧美一区| 午夜激情亚洲| 久久久天天操| 欧美人妖另类| 国产欧美日韩一区| 国产在线不卡精品| 国产自产在线视频一区| 精品成人一区二区三区| 亚洲高清视频在线| 宅男噜噜噜66一区二区| 国产九色精品成人porny| 欧美专区在线观看一区| 久久午夜国产精品| 欧美理论大片| 国产欧美日韩精品一区 | 美女免费视频一区| 久久综合九色综合欧美就去吻| 久久婷婷人人澡人人喊人人爽| 欧美69wwwcom| 国产精品视频大全| 亚洲第一精品夜夜躁人人爽| 妖精成人www高清在线观看| 欧美一区二区在线| 亚洲欧美日韩精品久久久久 | 91久久在线视频| 一本色道婷婷久久欧美| 久久精品日产第一区二区三区| 欧美成年人视频| 国产精品午夜在线| 亚洲精品日韩欧美| 欧美在线一区二区| 亚洲精品乱码视频| 久久漫画官网| 午夜国产精品视频免费体验区| 欧美成人免费观看| 欧美日韩精品在线| 亚洲高清激情| 开心色5月久久精品| 9色精品在线| 亚洲国产精品一区二区第一页| 在线视频欧美日韩| 欧美精品性视频| 在线成人亚洲| 久久久精品一品道一区| 制服丝袜激情欧洲亚洲| 亚洲少妇中出一区| 欧美激情成人在线视频| 一区精品在线播放| 久久精品免费| 午夜精品成人在线视频| 欧美性淫爽ww久久久久无| 亚洲日本中文| 亚洲电影免费观看高清完整版在线| 亚洲精品中文字幕在线| 欧美va天堂在线| 亚洲国产日韩欧美在线动漫| 久久久视频精品| 模特精品在线| 久久琪琪电影院| 亚洲国产精品www| 欧美国产乱视频| 你懂的视频欧美| 欧美视频一区二区三区…| 亚洲欧洲一区| 亚洲欧美久久久久一区二区三区| 亚洲欧洲精品一区| 欧美日韩亚洲综合| 亚洲一区免费| 亚洲淫性视频| 国产欧美日韩一区二区三区| 性欧美长视频| 久久精品免视看| 亚洲国产高潮在线观看| 亚洲丰满少妇videoshd| 欧美人与性动交cc0o| 亚洲午夜久久久久久尤物 | 欧美一区二区视频在线| 国模吧视频一区| 欧美国产日韩视频| 亚洲精品激情| 狠狠色丁香婷综合久久| 久久精品国产一区二区三区| 免费91麻豆精品国产自产在线观看| 亚洲午夜激情网页| 国产精品视屏| 久久精品男女| 亚洲区国产区| 欧美一区二区视频网站| 国产农村妇女毛片精品久久麻豆 | 欧美伦理一区二区| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品毛片va一区二区三区| 中文国产一区| 欧美福利一区| 欧美一区免费| 亚洲午夜一二三区视频| 国产一区亚洲一区| 国产精品久久久| 欧美日本簧片| 久久九九久精品国产免费直播| 日韩视频在线观看国产| 蜜臀av在线播放一区二区三区| 亚洲精品视频在线观看免费| 亚洲电影一级黄| 国产精品99久久久久久久女警 | 国产视频在线观看一区二区三区| 免费观看在线综合色| 亚洲国产精品久久久久秋霞蜜臀| 亚洲一线二线三线久久久| 最新日韩精品| 欧美国产亚洲视频| 91久久久亚洲精品| 欧美激情亚洲| 麻豆9191精品国产| 久久精品国产精品亚洲| 亚洲国产精品www| 欧美1区视频| 蜜臀a∨国产成人精品| 免播放器亚洲一区| 久久婷婷亚洲| 欧美一区二区三区免费观看视频| 蜜乳av另类精品一区二区| 久久精品一级爱片| 久久久久国产一区二区| 久久国内精品自在自线400部| 亚洲特级片在线| 午夜一区二区三区不卡视频| 亚洲一区二区视频在线观看| 亚洲在线观看免费| 中文久久精品| 午夜激情久久久| 欧美r片在线| 欧美激情二区三区| 欧美视频福利| 狠狠色狠狠色综合| 国产午夜亚洲精品羞羞网站| 欧美性色视频在线| 欧美手机在线视频| 国产综合久久久久影院| 99国产精品私拍| 久久黄色小说| 99亚洲伊人久久精品影院红桃| 性欧美激情精品| 亚洲一级黄色| 亚洲黄色av| 久久综合给合久久狠狠色| 国产精品综合久久久| 亚洲精品视频一区| 久久久午夜电影| 亚洲一区视频在线观看视频| 国内精品久久久久伊人av| 国内精品久久久久久影视8| 亚洲免费视频网站| 日韩视频中午一区| 久久狠狠一本精品综合网| 国产精品国产馆在线真实露脸 | 欧美日韩一区三区| 狠狠88综合久久久久综合网| 欧美一区二区在线播放| 亚洲视频观看| 国产精品成人免费视频| 亚洲免费观看高清在线观看| 欧美成年人网| 久久激情视频久久| 亚洲国产精品久久人人爱蜜臀| 久久中文字幕一区| 浪潮色综合久久天堂| 亚洲人成网站999久久久综合| 欧美激情第8页| 国产精品成人午夜| 中日韩男男gay无套| 亚洲免费一在线| 精品1区2区| 亚洲国产综合91精品麻豆| 欧美日韩国语| 久久精品国产清自在天天线| 久久精品99久久香蕉国产色戒| 在线看片欧美| 伊人久久亚洲热| 亚洲高清不卡| 国产亚洲欧美一区二区| 欧美激情一区二区三区全黄| 欧美日韩一卡| 在线亚洲自拍| 牛牛国产精品| 免费日韩成人| 国产欧美在线视频| 99视频国产精品免费观看| 亚洲国产精品一区| 久久精品国产亚洲一区二区三区| 亚洲欧洲久久|