windows的運行機制_第1頁
windows的運行機制_第2頁
windows的運行機制_第3頁
windows的運行機制_第4頁
windows的運行機制_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、TextOut(hDC,200,0,九九乘法表,strlen(九九乘法表); TextOut(hDC,20,20,1*1=1,strlen(1*1=1); TextOut(hDC,20,40,1*2=2 2*2=4,strlen(1*2=2 2*2=4); TextOut(hDC,20,60,1*3=3 2*3=6 3*3=9,strlen(1*3=3 2*3=6 3*3=9); TextOut(hDC,20,80,1*4=4 2*4=8 3*4=12 4*4=16,strlen(1*4=4 2*4=8 3*4=12 4*4=16); TextOut(hDC,20,100,1*5=5 2*5=

2、10 3*5=15 4*5=20 5*5=25,strlen(1*5=5 2*5=10 3*5=15 4*5=20 5*5=25); TextOut(hDC,20,120,1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36,strlen(1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36); TextOut(hDC,20,140,1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49,strlen(1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49);

3、 TextOut(hDC,20,160,1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64,strlen(1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64); TextOut(hDC,20,180,1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81,strlen(1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81); 作業(yè)上交方式作業(yè)上

4、交方式 你的工程名為 學號_*(*分別用1,2,3等代表第一次作業(yè))例如: 學號為1108320126,則第一次作業(yè)的工程名為1108320126_1,則編譯鏈接后會形成子目錄1108320126_1 ,其中該目錄下會有debug子目錄,將debug子目錄刪除,然后將1108320126_1整個目錄壓縮成一個文件發(fā)到郵箱。MFC程序的運行機制程序的運行機制 SDK程序的運行過程程序的運行過程 進入進入WinMainWinMain后,首先設計窗口類,注冊窗口、后,首先設計窗口類,注冊窗口、創(chuàng)建窗口、然后顯示窗口、更新窗口、最后進創(chuàng)建窗口、然后顯示窗口、更新窗口、最后進入消息循環(huán),將消息路由到我們

5、的窗口過程函入消息循環(huán),將消息路由到我們的窗口過程函數(shù)中去處理數(shù)中去處理 。MFC程序的啟動與死亡順序程序的啟動與死亡順序單文檔應用程序單文檔應用程序WinGreet中使用到的類中使用到的類文檔模板類:文檔模板類:直接使直接使用,管理文檔、視圖用,管理文檔、視圖和框架和框架文檔類:文檔類:負責數(shù)據(jù)負責數(shù)據(jù)結(jié)構(gòu)與文件操作結(jié)構(gòu)與文件操作應應用用類類框架類框架類:主窗口主窗口視圖類:視圖類:負責數(shù)據(jù)負責數(shù)據(jù)的顯示與打印的顯示與打印狀態(tài)欄和工具欄直狀態(tài)欄和工具欄直接使用接使用MFC程序的啟動程序的啟動1、創(chuàng)建、創(chuàng)建Applicationobject對象對象theApp程序一開始生產(chǎn)一個程序一開始生產(chǎn)一

6、個( (且只有一個且只有一個) )應用類對象應用類對象 theApptheApp,也即一個也即一個CWinAppCWinApp對象,這個全局對象一產(chǎn)生,便執(zhí)行其對象,這個全局對象一產(chǎn)生,便執(zhí)行其構(gòu)造函數(shù),導致其基類構(gòu)造函數(shù),導致其基類CWinAppCWinApp類的構(gòu)造函數(shù)被調(diào)用。該類的構(gòu)造函數(shù)被調(diào)用。該函數(shù)定義于函數(shù)定義于APPCORE.CPPAPPCORE.CPP第第7575行,因此,行,因此,CWinAppCWinApp之中的之中的成員變量將因為成員變量將因為theApptheApp這個全局對象的誕生而獲得配置這個全局對象的誕生而獲得配置與初值與初值在在SDKSDK編程時,是通過一個應用

7、程序的實例號來標示一個應用程序編程時,是通過一個應用程序的實例號來標示一個應用程序的。在基于的。在基于MFCMFC應用程序中,是通過產(chǎn)生一個應用類的對象來唯一應用程序中,是通過產(chǎn)生一個應用類的對象來唯一標識我們的整個應用程序標識我們的整個應用程序。MFC程序的啟動程序的啟動2、WinMain登場登場用用SDK編程序時,程序的入口點是編程序時,程序的入口點是WinMain函數(shù),函數(shù),而在而在MFC程序里我們并沒有看到程序里我們并沒有看到WinMain函數(shù),函數(shù),原原來她是被隱藏在來她是被隱藏在MFC代碼里面了。當代碼里面了。當theApp配置完配置完成后,成后,WinMain登場。登場。MFC早

8、已準備好并由鏈接器直早已準備好并由鏈接器直接加到應用程序代碼中了,原來她在接加到應用程序代碼中了,原來她在appmodul.cpp里面。里面。MFC程序的啟動程序的啟動APPMODUL.CPP摘出來的代碼摘出來的代碼 _tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)/callshared/exportedWinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);_tWinMain函數(shù)的函數(shù)的“_t”是為了支

9、持是為了支持Unicode而準備的一個而準備的一個宏宏 MFC程序的啟動程序的啟動AfxWinMain函數(shù)定義于函數(shù)定義于WINMAIN.CPP第第21行行intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)intnReturnCode=-1;CWinApp*pApp=AfxGetApp();AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);pApp-InitApplication();pApp-InitIn

10、stance()nReturnCode=pApp-Run();AfxWinTerm();returnnReturnCode;MFC程序的啟動程序的啟動AfxGetApp()函數(shù)是取得函數(shù)是取得CWinGreetApp對象指針,故上面函對象指針,故上面函數(shù)第數(shù)第4至至6行相當于調(diào)用:行相當于調(diào)用:CWinGreetApp:InitApplication();CWinGreetApp:InitInstance()CWinGreetApp:Run();因而導致調(diào)用:因而導致調(diào)用:CWinApp:InitApplication();/因為因為CWinGreetApp并沒有改寫并沒有改寫InitAppl

11、icationCWinGreetApp:InitInstance()/因為因為CWinGreetApp改寫了改寫了InitInstanceCWinApp:Run();/因為因為CWinGreetApp并沒有改寫并沒有改寫RunMFC程序的啟動程序的啟動3 3、AfxWinInitAfxWinInitAFXAFX內(nèi)部初始化操作內(nèi)部初始化操作AfxWinInitAfxWinInit是繼是繼CWinAppCWinApp構(gòu)造函數(shù)之后的第一個操作構(gòu)造函數(shù)之后的第一個操作,主要做的是,主要做的是AFXAFX內(nèi)部初始化操作內(nèi)部初始化操作4 4、執(zhí)行、執(zhí)行CWinApp:InitApplicationCWin

12、App:InitApplication AfxWinInitAfxWinInit之后的操作是之后的操作是pApp-InitApplicationpApp-InitApplication 而而pApppApp指向指向CWinGreetAppCWinGreetApp對象,所以對象,所以相當于調(diào)用:相當于調(diào)用: CWinGreetApp:InitApplication();CWinGreetApp:InitApplication(); 而而CWinGreetAppCWinGreetApp繼承自繼承自CWinApp, InitApplicationCWinApp, InitApplication又是又

13、是CWinAppCWinApp的一個虛擬函數(shù),我們并沒有改寫它的一個虛擬函數(shù),我們并沒有改寫它( (大大部分情況下不需改寫它部分情況下不需改寫它) ),所以上述操作相當于調(diào)用,所以上述操作相當于調(diào)用CWinApp:InitApplication(); MFCCWinApp:InitApplication(); MFC完成內(nèi)部管理完成內(nèi)部管理MFC程序的啟動程序的啟動5、執(zhí)行、執(zhí)行CWinApp:InitInstance繼繼InitApplication函數(shù)之后,函數(shù)之后,AfxWinMain調(diào)用調(diào)用pApp-InitInstance。當程序調(diào)用:當程序調(diào)用:pApp-InitInstance(

14、);相當于調(diào)用:相當于調(diào)用:CWinGreetApp:InitInstance();而而CWinGreetApp繼承自繼承自CWinApp,而而InitInstance又是又是CWinApp的一個虛擬函數(shù)。由于我們改寫了它的一個虛擬函數(shù)。由于我們改寫了它,所以上述操作就是調(diào)用我們自己,所以上述操作就是調(diào)用我們自己(CWinGreetApp)的這個的這個InitInstance函數(shù)。函數(shù)。MFC程序的啟動程序的啟動6、窗口注冊及窗口創(chuàng)建、窗口注冊及窗口創(chuàng)建在在CWinGreetApp:InitInstance函數(shù)內(nèi)有函數(shù)內(nèi)有ProcessShellCommand(cmdInfo)這個函數(shù),在這個

15、這個函數(shù),在這個函數(shù)內(nèi)實現(xiàn)函數(shù)內(nèi)實現(xiàn)窗口的注冊窗口的注冊,窗口的創(chuàng)建窗口的創(chuàng)建。【注意注意】由于框架、視圖、工具條和狀態(tài)條都是窗口,由于框架、視圖、工具條和狀態(tài)條都是窗口,所以在這個過程中都要創(chuàng)建這些窗口。所以在這個過程中都要創(chuàng)建這些窗口。MFC程序的啟動程序的啟動剖析剖析ProcessShellCommand(cmdInfo)函數(shù)函數(shù)(1)DOCTEMPL.CPP的的264行行CFrameWnd*pFrame=(CFrameWnd*)m_pFrameClass-CreateObject();在這個函數(shù)內(nèi)會通過在這個函數(shù)內(nèi)會通過new算子創(chuàng)建框架類算子創(chuàng)建框架類CMainFrame。先調(diào)用基類

16、先調(diào)用基類CFrameWnd的構(gòu)造函數(shù),再調(diào)用的構(gòu)造函數(shù),再調(diào)用CMainFrame的構(gòu)的構(gòu)造函數(shù),接著調(diào)用狀態(tài)條類造函數(shù),接著調(diào)用狀態(tài)條類CStatusBar的構(gòu)造函數(shù)和工具條類的構(gòu)造函數(shù)和工具條類CToolBar的構(gòu)造函數(shù)。的構(gòu)造函數(shù)。MFC程序的啟動程序的啟動DOCTEMPL.CPP的的277行行(2)pFrame-LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW|FWS_ADDTOTITLE,NULL,&context)在這個函數(shù)內(nèi)完成窗口類的注冊,產(chǎn)生主窗口并加掛菜單等諸元在這個函數(shù)內(nèi)完成窗口類的注冊,產(chǎn)生主窗口并加掛菜單等諸元素,并指定

17、窗口標題、文件標題、文件擴展名等。素,并指定窗口標題、文件標題、文件擴展名等。該函數(shù)內(nèi)部將依次調(diào)用該函數(shù)內(nèi)部將依次調(diào)用AfxDeferRegisterClass,Create,后者,后者將調(diào)用將調(diào)用CreateWindowEx,于是觸發(fā),于是觸發(fā)WM_CREATE消息。消息。MFC程序的啟動程序的啟動a)AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)它是個宏,實際調(diào)用它是個宏,實際調(diào)用AfxEndDeferRegisterClass函數(shù)。函數(shù)。#defineAfxDeferRegisterClass(fClass)AfxEndDeferRegiste

18、rClass(fClass)定義于定義于AFXIMPL.H中的宏中的宏這個函數(shù)進一步調(diào)用這個函數(shù)進一步調(diào)用AfxRegisterClass(pWndCls);來完成來完成窗口窗口類的注冊類的注冊。在在MFC中,預先給我們定義好了缺省的窗口類,我們只需調(diào)用中,預先給我們定義好了缺省的窗口類,我們只需調(diào)用AfxEndDeferRegisterClass去注冊就可以。它會根據(jù)我們的應去注冊就可以。它會根據(jù)我們的應用程序選擇不同的窗口去注冊。用程序選擇不同的窗口去注冊。MFC程序的啟動程序的啟動b)在在Create中會調(diào)用中會調(diào)用CreateWindowEx,于是觸發(fā)于是觸發(fā)WM_CREATE消息。消

19、息。由于在由于在CMainFrame中攔截了中攔截了WM_CREATE消息消息(利用(利用ON_WM_CREATE宏),所以宏),所以WM_CREATE消息產(chǎn)生之消息產(chǎn)生之際會調(diào)用際會調(diào)用CMainFrame類的類的OnCreate函數(shù)。在此函數(shù)內(nèi)先調(diào)用函數(shù)。在此函數(shù)內(nèi)先調(diào)用基類基類CFrameWnd的的OnCreate函數(shù),然后為主窗口掛上工具條函數(shù),然后為主窗口掛上工具條和狀態(tài)條。和狀態(tài)條。而在而在CFrameWnd:OnCreate中會創(chuàng)建視圖(中會創(chuàng)建視圖(CView)窗口)窗口MFC程序的啟動程序的啟動7、窗口顯示與更新、窗口顯示與更新窗口創(chuàng)建完成后,窗口創(chuàng)建完成后,回到回到Init

20、Instance,執(zhí)行執(zhí)行ShowWindow顯示窗口,顯示窗口,執(zhí)行執(zhí)行UpdateWindow發(fā)送發(fā)送WM_PAINT更新窗口。更新窗口。8、消息循環(huán)、消息循環(huán)InitInstance結(jié)束,回到結(jié)束,回到AfxWinMain,執(zhí)行,執(zhí)行Run,進入消息循環(huán)。,進入消息循環(huán)。MFC程序的啟動程序的啟動intAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)intnReturnCode=-1;CWinApp*pApp=AfxGetApp();AfxWinInit(hIns

21、tance,hPrevInstance,lpCmdLine,nCmdShow);pApp-InitApplication();pApp-InitInstance()nReturnCode=pApp-Run();AfxWinTerm();returnnReturnCode;MFC程序的運行程序的運行在在Run()中會調(diào)用()中會調(diào)用PumpMessageBOOLCWinThread:PumpMessage()if(!:GetMessage(&m_msgCur,NULL,NULL,NULL)returnFALSE;MFC程序的運行程序的運行/processthismessageif(m_m

22、sgCur.message!=WM_KICKIDLE&!PreTranslateMessage(&m_msgCur):TranslateMessage(&m_msgCur);:DispatchMessage(&m_msgCur);returnTRUE;MFC程序的運行程序的運行在在SDK程序中,消息是通過窗口函程序中,消息是通過窗口函數(shù)來處理,而現(xiàn)在窗口函數(shù)在哪里、數(shù)來處理,而現(xiàn)在窗口函數(shù)在哪里、又如何送到窗口函數(shù)手中呢?又如何送到窗口函數(shù)手中呢?MFC程序的運行程序的運行在執(zhí)行在執(zhí)行AfxEndDeferRegisterClass函數(shù),注冊窗口類時,可函數(shù),注

23、冊窗口類時,可以看到窗口過程函數(shù)以看到窗口過程函數(shù)wndcls.lpfnWndProc=DefWindowProc;雖然窗口過程函數(shù)被指定為雖然窗口過程函數(shù)被指定為DefWindowProc,但事實上并不是,但事實上并不是所有的消息都是交給缺省的窗口過程處理,而是采用轉(zhuǎn)換,即一所有的消息都是交給缺省的窗口過程處理,而是采用轉(zhuǎn)換,即一種種消息映射機制,消息映射機制,通過消息響應函數(shù)來處理消息。通過消息響應函數(shù)來處理消息。MFC程序的運行程序的運行消息映射機制消息映射機制-把消息與處理函數(shù)連接在一起把消息與處理函數(shù)連接在一起提供更方便的程序接口,讓程序員可以很方便建立消息和處理程提供更方便的程序接

24、口,讓程序員可以很方便建立消息和處理程序的對應關(guān)系。序的對應關(guān)系。這個方便的接口是通過兩組宏來實現(xiàn)的。這個方便的接口是通過兩組宏來實現(xiàn)的。首先在類聲明(首先在類聲明(.h文件)中文件)中結(jié)合結(jié)合DECLARE_MESSAGE_MAP()宏給出處理函數(shù),宏給出處理函數(shù),再在相應的再在相應的.CPP文件中文件中(當然不能在函數(shù)之內(nèi)當然不能在函數(shù)之內(nèi))使用使用BEBIN_MESSAGE_MAP()和和END_MESSAGE_MAP()宏把相應宏把相應的消息加入去的消息加入去MFC程序的運行程序的運行消息的種類與消息與函數(shù)間的對應關(guān)系消息的種類與消息與函數(shù)間的對應關(guān)系MFC程序的運行程序的運行標準標準

25、Windows消息(消息(WM_XXX)的對應規(guī)則的對應規(guī)則宏名稱對應關(guān)系消息處理函數(shù)(名稱已由系統(tǒng)默認)ON_WM_CHARWM_CHAROnCharON_WM_CREATEWM_CREATEOnCreateON_WM_CLOSEWM_CLOSEOnCloseON_WM_LBUTTONDOWM WM_LBUTTONDOMWOnLButtonDownON_WM_PAINTWM_PAINTOnPaintMFC程序的運行程序的運行命令消息(命令消息(WM_COMMAND)的一般性對應規(guī)則的一般性對應規(guī)則ON_COMMAND(,)如如ON_COMMAND(IDM_ABOUT,OnAbout)ON_C

26、OMMAND(IDM_FILENEW,OnFileNew)ON_COMMAND(IDM_FILEOPEN,OnFileOpen)MFC程序的運行程序的運行通知(通知(Notification)消息(由控件產(chǎn)生)的對)消息(由控件產(chǎn)生)的對應機制分為好幾種(因為控件本就分為好幾種)應機制分為好幾種(因為控件本就分為好幾種)控件宏名稱消息處理函數(shù)ButtonON_BN_CLICKED (,) memberFxnCombBoxON_CBN_DLICKED (,)memberFxnEditON_EN_SETFOCUS (,) memberFxnMFC程序的運行程序的運行為什么經(jīng)過這樣的宏之后,消息就會

27、自動流往指為什么經(jīng)過這樣的宏之后,消息就會自動流往指定的函數(shù)去呢?定的函數(shù)去呢?謎底在于謎底在于MessageMap的結(jié)構(gòu)設計的結(jié)構(gòu)設計MFC程序的啟動程序的啟動視圖類和框架類中都有個虛函數(shù)視圖類和框架類中都有個虛函數(shù)PreCreateWindow,他們的目的?,他們的目的?PreCreateWindow(CREATESTRUCT&cs)MFC程序的啟動程序的啟動PreCreateWindow函數(shù)的目的函數(shù)的目的就是讓我們在產(chǎn)生窗口前有機會去修改窗口的外觀。比如生成這就是讓我們在產(chǎn)生窗口前有機會去修改窗口的外觀。比如生成這個窗口,不想要最大化框。我們看到窗口的創(chuàng)建都是在個窗口,不想要最

28、大化框。我們看到窗口的創(chuàng)建都是在MFC的底的底層的基類中完成的,對于我們自己的類來說,沒有調(diào)用層的基類中完成的,對于我們自己的類來說,沒有調(diào)用CreateWindowEx的函數(shù)去創(chuàng)建窗口,因此它就設計了這個參數(shù)的函數(shù)去創(chuàng)建窗口,因此它就設計了這個參數(shù)讓我們有機會去修改窗口的外觀,而且定義為引用,當我們修改讓我們有機會去修改窗口的外觀,而且定義為引用,當我們修改結(jié)構(gòu)體的成員時,在基類中會有體現(xiàn)的。這個函數(shù)在結(jié)構(gòu)體的成員時,在基類中會有體現(xiàn)的。這個函數(shù)在CreateWindowEX前被調(diào)用。前被調(diào)用。CreateWindowEX函數(shù)所帶的參函數(shù)所帶的參數(shù)就是數(shù)就是CREATESTRUCT的結(jié)構(gòu)體中

29、的成員,因此就會創(chuàng)建一個的結(jié)構(gòu)體中的成員,因此就會創(chuàng)建一個符合我們要求的窗口。符合我們要求的窗口。MFC程序的來龍去脈程序的來龍去脈程序的誕生程序的誕生n應用對象產(chǎn)生,內(nèi)存于是獲得配置應用對象產(chǎn)生,內(nèi)存于是獲得配置nAfxWinMain執(zhí)行執(zhí)行AfxWinInt,進行初始化設置,進行初始化設置nAfxWinMain執(zhí)行執(zhí)行InitApplication,是個虛函數(shù),通常不改寫它,是個虛函數(shù),通常不改寫它nAfxWinMain執(zhí)行執(zhí)行InitInstance,是虛函數(shù),我們改寫它,是虛函數(shù),我們改寫它n在在InitInstance中執(zhí)行中執(zhí)行ProcessShellCommand(cmdInfo)實現(xiàn)窗實現(xiàn)窗口的注冊,創(chuàng)建??诘淖裕瑒?chuàng)建。n回到回到InitInstance中繼續(xù)執(zhí)行中繼續(xù)執(zhí)行ShowWindow,顯示窗口顯示窗口n執(zhí)行執(zhí)行UpdateWindow,發(fā)出,發(fā)出WM_PAINT消息。消息。n回到回到AfxWinMain,執(zhí)行,執(zhí)行Run,進入消息循環(huán)。,進入消息循環(huán)。MFC程序的運行過程程序的運行過程 MFC程序的來龍去脈程序的來龍去脈程序開始運行程序開始運行n程序獲得程序獲得WM_PAINT消息(消息(Run()中的()中的:PeekMessage)nWM_PAI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論