麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

MFC 程序入口和執(zhí)行流程

2019-11-10 19:14:27
字體:
供稿:網(wǎng)友

一 MFC程序執(zhí)行過程剖析

1)我們知道在WIN32API程序當(dāng)中,程序的入口為WinMain函數(shù),在這個函數(shù)當(dāng)中我們完成注冊窗口類,創(chuàng)建窗口,進(jìn)入消息循環(huán),最后由操作系統(tǒng)根據(jù)發(fā)送到程序窗口的消息調(diào)用程序的窗口函數(shù)。而在MFC程序當(dāng)中我們不在能找到類似WinMain這樣的程序入口,取而代之的是一系列派生類的聲明和定義以及一個沖CWinApp類派生而來的類的全局對象。CWinApp類被稱之為應(yīng)用程序?qū)ο螅谝粋€MFC程序當(dāng)中只允許有一個應(yīng)用程序?qū)ο蟆S捎贑WinApp的派生對象是全局的,因此這個對象的構(gòu)造函數(shù)會在所有的其他代碼運(yùn)行之前被調(diào)用,而由于CWinApp類當(dāng)中包含了HWND、HINSTANCE等句柄的存在,其構(gòu)造函數(shù)就執(zhí)行了對這些成員數(shù)據(jù)的初始化操作,這里的所謂初始化僅僅是把所有的句柄對象賦值為NULL。

2)在調(diào)用完CWinApp的構(gòu)造函數(shù)以后由連接器向程序內(nèi)自動鏈接的AfxWinMain函數(shù)將被調(diào)用,而這個函數(shù)可以被看作MFC程序的入口函數(shù)。在這個函數(shù)當(dāng)中調(diào)用全局AfxGetApp()函數(shù)獲得應(yīng)用程序?qū)ο螅@時將調(diào)用AfxInit全局函數(shù),這個函數(shù)的功能是使用操作系統(tǒng)傳遞給AfxWinMain函數(shù)的參數(shù)初始化應(yīng)用程序?qū)ο螽?dāng)中的相關(guān)句柄數(shù)據(jù)成員。

3)之后AfxWinMain函數(shù)調(diào)用CWinApp::Initapplication成員函數(shù),這個成員函數(shù)用來初始化應(yīng)用程序?qū)ο螽?dāng)中的關(guān)于文檔部分的內(nèi)容。

4)隨后調(diào)用CWinApp::InitInstance成員函數(shù),在這個成員函數(shù)當(dāng)中,使用new操作在堆上聲明一個框架窗口對象,由此導(dǎo)致框架窗口對象的構(gòu)造函數(shù)被調(diào)用,在框架窗口構(gòu)造函數(shù)當(dāng)中調(diào)用Create函數(shù)來創(chuàng)建窗口,而調(diào)用的Create函數(shù)一般將WNDCLASS參數(shù)設(shè)置成NULL,這樣就由MFC內(nèi)部調(diào)用PReCreateWindow函數(shù),在這個函數(shù)當(dāng)中由MFC注冊幾個默認(rèn)的WNDCLASS供框架窗口的Create使用。這時程序控制權(quán)交還給CWinApp::InitInstance成員函數(shù)內(nèi)部,由這個函數(shù)調(diào)用CWnd::ShowWindow顯示窗口并且調(diào)用CWnd::UpdateWindow向窗口發(fā)送WM_PAINT消息。調(diào)用完CWinApp::InitInstance成員函數(shù)后由AfxWinMain函數(shù)調(diào)用CWinApp::Run成員函數(shù),并由這個函數(shù)來創(chuàng)建和處理消息循環(huán),并且在沒有消息的時候處理OnIdle空閑處理。至此整個程序的創(chuàng)建過程完成。 5)在程序的運(yùn)行過程當(dāng)中,由操作系統(tǒng)源源不斷的發(fā)送消息給應(yīng)用程序,并且由CWinApp::Run當(dāng)中的消息循環(huán)處理并且分發(fā)給相關(guān)的窗口對象的DefWindowProc成員函數(shù),并由這個成員函數(shù)查詢窗口對象的消息映射表,如果查到對應(yīng)項,則由登記在消息映射表當(dāng)中的類成員函數(shù)處理,否則則按照Message Route當(dāng)中的順序象父層類發(fā)送。 6)在消息運(yùn)行結(jié)束,用戶按下關(guān)閉按鈕后,操作系統(tǒng)向程序發(fā)送WM_CLOSE消息,默認(rèn)狀況下程序調(diào)用DestoryWindow并且發(fā)送WM_DESTORY消息,應(yīng)用程序接受到這個消息以后的默認(rèn)操作是調(diào)用PostQuitMessage函數(shù),由這個函數(shù)發(fā)送WM_QUIT消息。當(dāng)程序?qū)ο蠼邮艿絎M_QUIT消息后消息循環(huán)結(jié)束,由AfxWinMain函數(shù)調(diào)用AfxTerm函數(shù)清理程序使用過的資源并且結(jié)束整個程序。小結(jié):以上的所有描述涵蓋了一個程序從開始、運(yùn)行到結(jié)束的所有過程。 相信大家有點暈點了吧,實際編程中沒有必要深刻理解這么多,這些大都是由MFC內(nèi)部自動幫我們完成的。實際MFC編程過程中,其實懂得MFC程序中各個函數(shù)的執(zhí)行流程即可。有時候過于追究MFC細(xì)節(jié)會白白浪費(fèi)我們的精力,應(yīng)該將主要精力放在使用MFC解決實際問題上。

 二 VC6中SDI程序的執(zhí)行流程下面以VC6中的sdi工程為例,通過給每個函數(shù)前設(shè)置斷點后調(diào)式執(zhí)行,可以看出MFC的SDI的執(zhí)行流程。記錄如下,希望對MFC執(zhí)行有疑惑的人有幫助。1)CSdiApp theApp;          //sdi.cpp2)CSdiApp::CSdiApp()             //sdi.cpp3)BOOL CSdiApp::InitInstance()         //sdi.cpp4)CSdiDoc::CSdiDoc()                   //sdiDoc.cpp5)CMainFrame::CMainFrame()          //MainFrm.cpp6)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)    //MainFrm.cpp7)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)    //MainFrm.cpp8)CSdiView::CSdiView()                     //sdiView.cpp9)BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs)         //sdiView.cpp10)BOOL CSdiDoc::OnNewDocument()                //sdiDoc.cpp11) void CSdiView::OnDraw(CDC* pDC)                //sdiView.cpp// ---------------- 關(guān)閉窗口后-------------------------------------12) CSdiView::~CSdiView()13) CMainFrame::~CMainFrame()14) CSdiDoc::~CSdiDoc() 
上一篇:最大子段和

下一篇:面向過程(3)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久影院午夜 | 国产91久久久久久 | 玖草在线资源 | 国产在线看一区 | 亚洲成人综合网站 | 久久精品女人天堂av | 日本精品免费观看 | 久久久国产一级片 | 手机av免费电影 | 免费观看亚洲视频 | 黑人操穴| 精品国产91久久久久 | 免费久久久久 | 久久精品无码一区二区三区 | 欧美aaaaaaaa| 色欲香天天天综合网站 | 久久蜜桃香蕉精品一区二区三区 | 国产精品视频专区 | 欧美精品色精品一区二区三区 | 国内精品久久久久久2021浪潮 | aa国产视频一区二区 | 婷婷一区二区三区四区 | 在线播放污 | 黄色va视频 | 九九热色 | av在线大全 | 玖草在线资源 | 久久久久二区 | 久久99精品久久久久久236 | 麻豆视频在线观看免费网站 | 成人片免费视频 | 免费午夜视频 | 999久久久 | 羞羞视频免费视频欧美 | 久色精品 | 免费一级片网站 | 98色视频| 毛片免费大全短视频 | 亚洲网站一区 | 99最新网址 | 国产精品99一区二区 |