程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MFC法式履行進程深刻分析

MFC法式履行進程深刻分析

編輯:關於C++

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法式設計。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved