MFC法式履行進程深刻分析。本站提示廣大學習愛好者:(MFC法式履行進程深刻分析)文章只能為提供參考,不一定能成為您想要的結果。以下是MFC法式履行進程深刻分析正文
本文較為具體的剖析了VC++法式設計的MFC法式履行進程,有助於加深對MFC法式運轉道理的懂得。分享給年夜家供年夜家參考之用。詳細剖析以下:
一 MFC法式履行進程分析
1)我們曉得在WIN32API法式傍邊,法式的進口為WinMain函數,在這個函數傍邊我們完成注冊窗口類,創立窗口,進入新聞輪回,最初由操作體系依據發送到法式窗口的新聞挪用法式的窗口函數。而在MFC法式傍邊我們不在能找到相似WinMain如許的法式進口,取而代之的是一系列派生類的聲明和界說和一個沖CWinApp類派生而來的類的全局對象。CWinApp類被稱之為運用法式對象,在一個MFC法式傍邊只許可有一個運用法式對象。因為CWinApp的派生對象是全局的,是以這個對象的結構函數會在一切的其他代碼運轉之前被挪用,而因為CWinApp類傍邊包括了HWND、HINSTANCE等句柄的存在,其結構函數就履行了對這些成員數據的初始化操作,這裡的所謂初始化僅僅是把一切的句柄對象賦值為NULL。
2)在挪用完CWinApp的結構函數今後由銜接器向法式內主動鏈接的AfxWinMain函數將被挪用,而這個函數可以被看做MFC法式的進口函數。在這個函數傍邊挪用全局AfxGetApp()函數取得運用法式對象,這時候將挪用AfxInit全局函數,這個函數的功效是應用操作體系傳遞給AfxWinMain函數的參數初始化運用法式對象傍邊的相干句柄數據成員。
3)以後AfxWinMain函數挪用CWinApp::InitApplication成員函數,這個成員函數用來初始化運用法式對象傍邊的關於文檔部門的內容。
4)隨後挪用CWinApp::InitInstance成員函數,在這個成員函數傍邊,應用new操作在堆上聲明一個框架窗口對象,由此招致框架窗口對象的結構函數被挪用,在框架窗口結構函數傍邊挪用Create函數來創立窗口,而挪用的Create函數普通將WNDCLASS參數設置成NULL,如許就由MFC外部挪用PreCreateWindow函數,在這個函數傍邊由MFC注冊幾個默許的WNDCLASS供框架窗口的Create應用。這時候法式掌握權交還給CWinApp::InitInstance成員函數外部,由這個函數挪用CWnd::ShowWindow顯示窗口而且挪用CWnd::UpdateWindow向窗口發送WM_PAINT新聞。挪用完CWinApp::InitInstance成員函數後由AfxWinMain函數挪用CWinApp::Run成員函數,並由這個函數來創立和處置新聞輪回,而且在沒有新聞的時刻處置OnIdle余暇處置。至此全部法式的創立進程完成。
5)在法式的運轉進程傍邊,由操作體系源源赓續的發送新聞給運用法式,而且由CWinApp::Run傍邊的新聞輪回處置而且分發給相干的窗口對象的DefWindowProc成員函數,並由這個成員函數查詢窗口對象的新聞映照表,假如查到對應項,則由掛號在新聞映照表傍邊的類成員函數處置,不然則依照Message Route傍邊的次序象父層類發送。
6)在新聞運轉停止,用戶按下封閉按鈕後,操作體系向法式發送WM_CLOSE新聞,默許狀態下法式挪用DestoryWindow而且發送WM_DESTORY新聞,運用法式接收到這個新聞今後的默許操作是挪用PostQuitMessage函數,由這個函數發送WM_QUIT新聞。當法式對象接收到WM_QUIT新聞後新聞輪回停止,由AfxWinMain函數挪用AfxTerm函數清算法式應用過的資本而且停止全部法式。
小結:以上的一切描寫涵蓋了一個法式從開端、運轉到停止的一切進程。 信任年夜家有點暈點了吧,現實編程中沒有需要深入懂得這麼多,這些年夜都是由MFC外部主動幫我們完成的。現實MFC編程進程中,其實理解MFC法式中各個函數的履行流程便可。有時刻過於窮究MFC細節會白白糟蹋我們的精神,應當將重要精神放在應用MFC處理現實成績上。
二 VC6中SDI法式的履行流程
上面以VC6中的sdi工程為例,經由過程給每一個函數前設置斷點後調式履行,可以看出MFC的SDI的履行流程。記載以下,願望對MFC履行有困惑的人有贊助。
1)CSdiApp theApp; //sdi.cpp
2)CSdiApp::CSdiApp() //sdi.cpp
3)BOOL CSdiApp::InitInstance() //sdi.cpp
4)CSdiDoc::CSdiDoc() //sdiDoc.cpp
5)CMainFrame::CMainFrame() //MainFrm.cpp
6)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) //MainFrm.cpp
7)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) //MainFrm.cpp
8)CSdiView::CSdiView() //sdiView.cpp
9)BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs) //sdiView.cpp
10)BOOL CSdiDoc::OnNewDocument() //sdiDoc.cpp
11) void CSdiView::OnDraw(CDC* pDC) //sdiView.cpp
// ---------------- 封閉窗口後-------------------------------------
12) CSdiView::~CSdiView()
13) CMainFrame::~CMainFrame()
14) CSdiDoc::~CSdiDoc()
感興致的同伙可以采取斷點調試測試一下SDI法式的履行流程,以加深對MFC運轉道理的懂得,從而更好的控制Windows法式設計。