衛(wèi)洪春 彭小利 蒲國(guó)林
摘 要: VC開(kāi)發(fā)環(huán)境中的Win32 Application生成窗口應(yīng)用程序,結(jié)構(gòu)簡(jiǎn)單清晰,MFC生成窗口應(yīng)用程序的過(guò)程相當(dāng)復(fù)雜。為了剖析MFC生成窗口應(yīng)用程序的具體過(guò)程,深入分析了MFC框架的源代碼及其調(diào)用關(guān)系,結(jié)合C++面向?qū)ο蠹夹g(shù)的封裝、繼承、多態(tài)、編譯預(yù)處理等機(jī)制,設(shè)計(jì)了一個(gè)模擬系統(tǒng),用以模擬MFC生成窗口應(yīng)用程序的具體過(guò)程及響應(yīng)各種消息,以助于深入領(lǐng)會(huì)、理解、應(yīng)用MFC架構(gòu),從而編寫(xiě)更好的應(yīng)用程序。
關(guān)鍵詞: 虛函數(shù); 窗口應(yīng)用程序; 消息映射; 面向?qū)ο蠹夹g(shù); MFC
中圖分類號(hào): TN711?34; TP391 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)11?0151?04
Abstract: The program structure generated by Win32 Application in VC development environment is simple and clear. The generation process of MFC generated window application program is fairly complex. In order to analyze the specific process of the MFC generated window application program, the source code of MFC framework and its calling relationship is studied deeply. In combination with encapsulation, inheritance, polymorphism and compiling preprocessor mechanisms of C++ object?orien?ted technology, a simulation system was designed to simulate the specific process of MFC generated window application program, and deal with various messages. It can help programmers to further comprehend and apply MFC architecture to write better Window?based application program.
Keywords: virtual function; window application program; message mapping; object?oriented technology; MFC
0 引 言
C++是功能強(qiáng)大的計(jì)算機(jī)編程語(yǔ)言,Microsoft Visual C++(簡(jiǎn)稱VC)是微軟提供的基于C/C++的應(yīng)用程序集成開(kāi)發(fā)工具。VC擁有豐富的功能和大量的擴(kuò)展庫(kù),利用它可以方便地編寫(xiě)各式各樣的應(yīng)用軟件,是面向?qū)ο蠹夹g(shù)程序設(shè)計(jì)語(yǔ)言C++的極佳應(yīng)用。典型的Win32窗口應(yīng)用程序的創(chuàng)建過(guò)程簡(jiǎn)單,結(jié)構(gòu)清晰,但開(kāi)發(fā)效率不高。利用MFC類庫(kù)和應(yīng)用程序框架,能夠方便地開(kāi)發(fā)具有Windows標(biāo)準(zhǔn)界面的應(yīng)用程序。雖然有很多資料介紹利用MFC開(kāi)發(fā)各種應(yīng)用程序,但對(duì)于MFC應(yīng)用程序窗口具體創(chuàng)建過(guò)程的介紹則相對(duì)簡(jiǎn)單,程序員感覺(jué)MFC框架生成窗口的過(guò)程復(fù)雜,難以理解MFC的動(dòng)態(tài)性、診斷性、持續(xù)性這三大特點(diǎn),以及消息映射機(jī)制?;谶@些因素,添加、處理各種消息更無(wú)所適從。本文詳細(xì)探討MFC的窗口生成過(guò)程,給出了窗口生成過(guò)程及響應(yīng)、處理消息的模擬程序,以幫助理解MFC的窗口創(chuàng)建過(guò)程[1]。
1 Win32窗口程序與基于MFC的窗口應(yīng)用
程序的基本結(jié)構(gòu)
1.1 Win32窗口程序的基本結(jié)構(gòu)
Win32窗口程序的執(zhí)行入口是WinMain函數(shù),其功能相當(dāng)于C語(yǔ)言中的main函數(shù)。生成并執(zhí)行一個(gè)典型的Win32窗口程序的結(jié)構(gòu)如下:
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
定義窗口類對(duì)象; 注冊(cè)窗口類對(duì)象; 創(chuàng)建窗口; 顯示窗口;更新窗口; 啟動(dòng)消息循環(huán);
其中WinMain函數(shù)體的功能相對(duì)固定,程序員所需做的主要工作是處理各種消息,即定義窗口WndPro函數(shù)的功能。生成并執(zhí)行一個(gè)Win32窗口程序可通過(guò)VC的Win32 Application向?qū)瓿???梢?jiàn)Win32窗口程序的結(jié)構(gòu)簡(jiǎn)單明了,修改方便,但隨著問(wèn)題越來(lái)越復(fù)雜、規(guī)模越來(lái)越大,系統(tǒng)開(kāi)發(fā)與維護(hù)的困難也隨之增加。VC集成開(kāi)發(fā)環(huán)境提供的MFC框架為建立功能強(qiáng)大的Windows應(yīng)用程序提供了方便。
1.2 基于MFC的窗口應(yīng)用程序的基本結(jié)構(gòu)
使用AppWizard開(kāi)發(fā)一個(gè)基于MFC的項(xiàng)目名為MyFirstMFC的單文檔窗口程序,其結(jié)構(gòu)如圖1所示。
運(yùn)行該程序后,可生成圖2所示的窗口應(yīng)用程序。在項(xiàng)目工作區(qū)中各個(gè)類的功能如下:
CMyFirstMFCApp:應(yīng)用程序類,負(fù)責(zé)程序的初始化和結(jié)束處理;
CMainFrame:主窗口類,負(fù)責(zé)主窗口的創(chuàng)建、顯示以及消息派發(fā);
CMyFirstMFCDoc:文檔類,負(fù)責(zé)應(yīng)用程序的數(shù)據(jù)存儲(chǔ)、修改和管理;
CMyFirstMFCView:視圖類,負(fù)責(zé)為數(shù)據(jù)的顯示和修改提供人機(jī)界面。
生成一個(gè)基于MFC的應(yīng)用程序的過(guò)程相對(duì)簡(jiǎn)單,但應(yīng)用程序窗口的具體創(chuàng)建過(guò)程卻顯得晦澀難懂。困惑的是:沒(méi)有編寫(xiě)任何代碼,便得到可以編譯運(yùn)行的應(yīng)用程序;在Win32 Application中看到的應(yīng)用程序執(zhí)行入口WinMain,在該程序中卻不見(jiàn)蹤影。本質(zhì)上,Windows程序結(jié)構(gòu)沒(méi)有變化,程序的最底層仍然是WinMain主函數(shù)和窗口函數(shù)WndProc。下面詳細(xì)分析并模擬MFC生成窗口應(yīng)用程序的過(guò)程。
2 系統(tǒng)結(jié)構(gòu)分析
MFC是基于面向?qū)ο蟮腃++編程技術(shù)的開(kāi)發(fā)平臺(tái),系統(tǒng)架構(gòu)特別復(fù)雜,主要體現(xiàn)在:系統(tǒng)類的層次結(jié)構(gòu);動(dòng)態(tài)性、診斷性、持續(xù)性這三大特點(diǎn);采用消息映射表而不是面向?qū)ο笾械奶摵瘮?shù)來(lái)響應(yīng)和處理消息。為了實(shí)現(xiàn)模擬MFC主框架窗口的生成過(guò)程,設(shè)計(jì)了幾個(gè)關(guān)鍵類[2?6],類的層次結(jié)構(gòu)如圖3所示,各個(gè)類的功能見(jiàn)表1。
3 系統(tǒng)詳細(xì)設(shè)計(jì)
該模擬系統(tǒng)中的各個(gè)類的詳細(xì)設(shè)計(jì)如圖4所示。其中,黑色實(shí)線標(biāo)識(shí)了類的層次關(guān)系,黑色虛線標(biāo)識(shí)了程序執(zhí)行過(guò)程中的調(diào)用順序。
實(shí)現(xiàn)該系統(tǒng)的關(guān)鍵代碼如下:
在WinMain主調(diào)函數(shù)中,程序按照?qǐng)D4中虛線箭頭所指方向順序執(zhí)行,其中,消息處理函數(shù)采用Win32 application 中的switch?case結(jié)構(gòu)。程序?qū)崿F(xiàn)了窗口的生成,位圖的加載,各種消息的響應(yīng) [7?10]。例如,窗口程序接收“鼠標(biāo)左鍵按下”消息后的運(yùn)算結(jié)果如圖5所示。
4 結(jié) 語(yǔ)
MFC框架生成窗口的過(guò)程是基于Win32 的窗口創(chuàng)建過(guò)程,是對(duì)Win32創(chuàng)建過(guò)程的面向?qū)ο蠹夹g(shù)的封裝。盡管MFC架構(gòu)相當(dāng)復(fù)雜,本文模擬并實(shí)現(xiàn)了MFC的基于面向?qū)ο蠹夹g(shù)生成窗口的過(guò)程及消息響應(yīng)。模擬程序?qū)FC的消息處理采用傳統(tǒng)的switch?case結(jié)構(gòu),但實(shí)際的MFC的消息處理機(jī)制拋棄了傳統(tǒng)的消息處理結(jié)構(gòu),也沒(méi)有利用面向?qū)ο蠹夹g(shù)的虛函數(shù)機(jī)制,而是采用消息映射表模式,完成對(duì)消息的響應(yīng)。MFC窗口創(chuàng)建過(guò)程的模擬程序?qū)斫獠㈧`活運(yùn)用MFC編寫(xiě)各種應(yīng)用軟件有較好的參考作用。
參考文獻(xiàn)
[1] 車忠志,孫雪雁.MFC應(yīng)用程序基本框架分析[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2010(9):145?147.
[2] 孔垂柳.VC++中MFC框架技術(shù)探索[J].吉林建筑工程學(xué)院學(xué)報(bào),2009(8):82?84.
[3] 梅章明,張秀山.基于MFC和OpenGL的噴泉模擬實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2012(17):41?43.
[4] 劉連喜,徐惠民.MFC框架中的設(shè)計(jì)模式分析[J].計(jì)算機(jī)應(yīng)用與軟件,2005(9):50?52.
[5] 徐璇,姜明新,黃靜,等.基于MFC的工程軟件界面設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(21):11?13.
[6] 范志先,孫殿柱,李延瑞,等.采用MFC開(kāi)發(fā)用戶交互界面的新方法[J].工程圖學(xué)學(xué)報(bào),2008(4):160?163.
[7] 謝裕敏,舒輝,陳建敏,等.MFC消息響應(yīng)函數(shù)的逆向定位[J].計(jì)算機(jī)應(yīng)用,2009(5):1393?1396.
[8] 夏俊杰,趙剛.基于MFC的代碼編輯器設(shè)計(jì)方法[J].現(xiàn)代電子技術(shù),2012,35(4):28?30.
[9] 劉玲,曹建秋,周建,等.基于編程切入點(diǎn)的MFC教學(xué)方法研究[J].西南師范大學(xué)學(xué)報(bào):自然科學(xué)版,2010(4):115?119.
[10] 錢樂(lè)毅.基于MFC的矢量圖形系統(tǒng)研究與實(shí)現(xiàn)[J].北京測(cè)繪,2012(1):1?4.
2 系統(tǒng)結(jié)構(gòu)分析
MFC是基于面向?qū)ο蟮腃++編程技術(shù)的開(kāi)發(fā)平臺(tái),系統(tǒng)架構(gòu)特別復(fù)雜,主要體現(xiàn)在:系統(tǒng)類的層次結(jié)構(gòu);動(dòng)態(tài)性、診斷性、持續(xù)性這三大特點(diǎn);采用消息映射表而不是面向?qū)ο笾械奶摵瘮?shù)來(lái)響應(yīng)和處理消息。為了實(shí)現(xiàn)模擬MFC主框架窗口的生成過(guò)程,設(shè)計(jì)了幾個(gè)關(guān)鍵類[2?6],類的層次結(jié)構(gòu)如圖3所示,各個(gè)類的功能見(jiàn)表1。
3 系統(tǒng)詳細(xì)設(shè)計(jì)
該模擬系統(tǒng)中的各個(gè)類的詳細(xì)設(shè)計(jì)如圖4所示。其中,黑色實(shí)線標(biāo)識(shí)了類的層次關(guān)系,黑色虛線標(biāo)識(shí)了程序執(zhí)行過(guò)程中的調(diào)用順序。
實(shí)現(xiàn)該系統(tǒng)的關(guān)鍵代碼如下:
在WinMain主調(diào)函數(shù)中,程序按照?qǐng)D4中虛線箭頭所指方向順序執(zhí)行,其中,消息處理函數(shù)采用Win32 application 中的switch?case結(jié)構(gòu)。程序?qū)崿F(xiàn)了窗口的生成,位圖的加載,各種消息的響應(yīng) [7?10]。例如,窗口程序接收“鼠標(biāo)左鍵按下”消息后的運(yùn)算結(jié)果如圖5所示。
4 結(jié) 語(yǔ)
MFC框架生成窗口的過(guò)程是基于Win32 的窗口創(chuàng)建過(guò)程,是對(duì)Win32創(chuàng)建過(guò)程的面向?qū)ο蠹夹g(shù)的封裝。盡管MFC架構(gòu)相當(dāng)復(fù)雜,本文模擬并實(shí)現(xiàn)了MFC的基于面向?qū)ο蠹夹g(shù)生成窗口的過(guò)程及消息響應(yīng)。模擬程序?qū)FC的消息處理采用傳統(tǒng)的switch?case結(jié)構(gòu),但實(shí)際的MFC的消息處理機(jī)制拋棄了傳統(tǒng)的消息處理結(jié)構(gòu),也沒(méi)有利用面向?qū)ο蠹夹g(shù)的虛函數(shù)機(jī)制,而是采用消息映射表模式,完成對(duì)消息的響應(yīng)。MFC窗口創(chuàng)建過(guò)程的模擬程序?qū)斫獠㈧`活運(yùn)用MFC編寫(xiě)各種應(yīng)用軟件有較好的參考作用。
參考文獻(xiàn)
[1] 車忠志,孫雪雁.MFC應(yīng)用程序基本框架分析[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2010(9):145?147.
[2] 孔垂柳.VC++中MFC框架技術(shù)探索[J].吉林建筑工程學(xué)院學(xué)報(bào),2009(8):82?84.
[3] 梅章明,張秀山.基于MFC和OpenGL的噴泉模擬實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2012(17):41?43.
[4] 劉連喜,徐惠民.MFC框架中的設(shè)計(jì)模式分析[J].計(jì)算機(jī)應(yīng)用與軟件,2005(9):50?52.
[5] 徐璇,姜明新,黃靜,等.基于MFC的工程軟件界面設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(21):11?13.
[6] 范志先,孫殿柱,李延瑞,等.采用MFC開(kāi)發(fā)用戶交互界面的新方法[J].工程圖學(xué)學(xué)報(bào),2008(4):160?163.
[7] 謝裕敏,舒輝,陳建敏,等.MFC消息響應(yīng)函數(shù)的逆向定位[J].計(jì)算機(jī)應(yīng)用,2009(5):1393?1396.
[8] 夏俊杰,趙剛.基于MFC的代碼編輯器設(shè)計(jì)方法[J].現(xiàn)代電子技術(shù),2012,35(4):28?30.
[9] 劉玲,曹建秋,周建,等.基于編程切入點(diǎn)的MFC教學(xué)方法研究[J].西南師范大學(xué)學(xué)報(bào):自然科學(xué)版,2010(4):115?119.
[10] 錢樂(lè)毅.基于MFC的矢量圖形系統(tǒng)研究與實(shí)現(xiàn)[J].北京測(cè)繪,2012(1):1?4.
2 系統(tǒng)結(jié)構(gòu)分析
MFC是基于面向?qū)ο蟮腃++編程技術(shù)的開(kāi)發(fā)平臺(tái),系統(tǒng)架構(gòu)特別復(fù)雜,主要體現(xiàn)在:系統(tǒng)類的層次結(jié)構(gòu);動(dòng)態(tài)性、診斷性、持續(xù)性這三大特點(diǎn);采用消息映射表而不是面向?qū)ο笾械奶摵瘮?shù)來(lái)響應(yīng)和處理消息。為了實(shí)現(xiàn)模擬MFC主框架窗口的生成過(guò)程,設(shè)計(jì)了幾個(gè)關(guān)鍵類[2?6],類的層次結(jié)構(gòu)如圖3所示,各個(gè)類的功能見(jiàn)表1。
3 系統(tǒng)詳細(xì)設(shè)計(jì)
該模擬系統(tǒng)中的各個(gè)類的詳細(xì)設(shè)計(jì)如圖4所示。其中,黑色實(shí)線標(biāo)識(shí)了類的層次關(guān)系,黑色虛線標(biāo)識(shí)了程序執(zhí)行過(guò)程中的調(diào)用順序。
實(shí)現(xiàn)該系統(tǒng)的關(guān)鍵代碼如下:
在WinMain主調(diào)函數(shù)中,程序按照?qǐng)D4中虛線箭頭所指方向順序執(zhí)行,其中,消息處理函數(shù)采用Win32 application 中的switch?case結(jié)構(gòu)。程序?qū)崿F(xiàn)了窗口的生成,位圖的加載,各種消息的響應(yīng) [7?10]。例如,窗口程序接收“鼠標(biāo)左鍵按下”消息后的運(yùn)算結(jié)果如圖5所示。
4 結(jié) 語(yǔ)
MFC框架生成窗口的過(guò)程是基于Win32 的窗口創(chuàng)建過(guò)程,是對(duì)Win32創(chuàng)建過(guò)程的面向?qū)ο蠹夹g(shù)的封裝。盡管MFC架構(gòu)相當(dāng)復(fù)雜,本文模擬并實(shí)現(xiàn)了MFC的基于面向?qū)ο蠹夹g(shù)生成窗口的過(guò)程及消息響應(yīng)。模擬程序?qū)FC的消息處理采用傳統(tǒng)的switch?case結(jié)構(gòu),但實(shí)際的MFC的消息處理機(jī)制拋棄了傳統(tǒng)的消息處理結(jié)構(gòu),也沒(méi)有利用面向?qū)ο蠹夹g(shù)的虛函數(shù)機(jī)制,而是采用消息映射表模式,完成對(duì)消息的響應(yīng)。MFC窗口創(chuàng)建過(guò)程的模擬程序?qū)斫獠㈧`活運(yùn)用MFC編寫(xiě)各種應(yīng)用軟件有較好的參考作用。
參考文獻(xiàn)
[1] 車忠志,孫雪雁.MFC應(yīng)用程序基本框架分析[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2010(9):145?147.
[2] 孔垂柳.VC++中MFC框架技術(shù)探索[J].吉林建筑工程學(xué)院學(xué)報(bào),2009(8):82?84.
[3] 梅章明,張秀山.基于MFC和OpenGL的噴泉模擬實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2012(17):41?43.
[4] 劉連喜,徐惠民.MFC框架中的設(shè)計(jì)模式分析[J].計(jì)算機(jī)應(yīng)用與軟件,2005(9):50?52.
[5] 徐璇,姜明新,黃靜,等.基于MFC的工程軟件界面設(shè)計(jì)[J].電子設(shè)計(jì)工程,2011(21):11?13.
[6] 范志先,孫殿柱,李延瑞,等.采用MFC開(kāi)發(fā)用戶交互界面的新方法[J].工程圖學(xué)學(xué)報(bào),2008(4):160?163.
[7] 謝裕敏,舒輝,陳建敏,等.MFC消息響應(yīng)函數(shù)的逆向定位[J].計(jì)算機(jī)應(yīng)用,2009(5):1393?1396.
[8] 夏俊杰,趙剛.基于MFC的代碼編輯器設(shè)計(jì)方法[J].現(xiàn)代電子技術(shù),2012,35(4):28?30.
[9] 劉玲,曹建秋,周建,等.基于編程切入點(diǎn)的MFC教學(xué)方法研究[J].西南師范大學(xué)學(xué)報(bào):自然科學(xué)版,2010(4):115?119.
[10] 錢樂(lè)毅.基于MFC的矢量圖形系統(tǒng)研究與實(shí)現(xiàn)[J].北京測(cè)繪,2012(1):1?4.