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()?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CF888E Maximum Subsequence(meet in the middle)

給一個數列和m&#xff0c;在數列任選若干個數&#xff0c;使得他們的和對m取模后最大&#xff08; \(1<n<35\) , \(1<m<10^{9}\)&#xff09; 考慮把數列分成兩份&#xff0c;兩邊分別暴力求出所有的可能&#xff0c;那么對于一個數列中每一個數字\(x\)&#xff0…

virtualbox php mac,詳解mac下通過docker搭建LEMP環境

在mac下通過docker搭建LEMP環境境1.安裝virtualbox。由于docker是在lxc環境的容器2.安裝boot2docker&#xff0c;用于與docker客戶端通訊> brew update> brew install docker> brew install boot2docker3.初始化boot2docker&#xff0c;也就是在virtualbox上安裝一個d…

SpringBoot項目打war包部署Tomcat教程

一、簡介 正常來說SpringBoot項目就直接用jar包來啟動&#xff0c;使用它內部的tomcat實現微服務&#xff0c;但有些時候可能有部署到外部tomcat的需求&#xff0c;本教程就講解一下如何操作 二、修改pom.xml 將要部署的module的pom.xml文件<packaging>節點設置為war <…

在VS2005中使用添加變量向導十分的

在VS2005中使用添加變量向導十分的方便&#xff0c;但是如何手動添加呢。可以分為2步&#xff1a; 1. 在控件對應的類的頭文件中添加相應的變量聲明&#xff08;如&#xff1a;CString m_strResult&#xff09; 2. 在類的實現文件中的DoDataExchange(CDataExchange* pDX)函數…

關于如何使用xposed來hook微信軟件

安卓端 難點有兩個 收款碼的生成和到帳監聽需要源碼加 2442982910轉載于:https://www.cnblogs.com/ganchuanpu/p/10220705.html

GitHub動作簡介

GitHub Actions can be a little confusing if you’re new to DevOps and the CI/CD world, so in this article, we’re going to explore some features and see what we can do using the tool.如果您是DevOps和CI / CD領域的新手&#xff0c;那么GitHub Actions可能會使您…

java returnaddress,JVM之數據類型

《Java虛擬機規范》閱讀筆記-數據類型1.概述Java虛擬機的數據類型可分為兩大類&#xff1a;原始類型(Primitive Types&#xff0c;也稱為基本類型)和引用類型(Reference Types)。Java虛擬機用不同的字節碼指令來操作不同的數據類型[1] 。2.原始類型原始類型是最基本的元素&…

C# matlab

編譯環境&#xff1a;Microsoft Visual Studio 2008版本 9.0.21022.8 RTMMicrosoft .NET Framework版本 3.5已安裝的版本: ProfessionalMicrosoft Visual Basic 2008 91986-031-5000002-60050Microsoft Visual Basic 2008Microsoft Visual C# 2008 91986-031-5000002-60050…

洛谷P3273 [SCOI2011] 棘手的操作 [左偏樹]

題目傳送門 棘手的操作 題目描述 有N個節點&#xff0c;標號從1到N&#xff0c;這N個節點一開始相互不連通。第i個節點的初始權值為a[i]&#xff0c;接下來有如下一些操作&#xff1a; U x y: 加一條邊&#xff0c;連接第x個節點和第y個節點A1 x v: 將第x個節點的權值增加vA2 x…

基于容器制作鏡像

一。鏡像基礎 一。基于容器制作鏡像 1. 查看并關聯運行的容器 [ghlocalhost ~]$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4da438fc9a8e busybox …

照顧好自己才能照顧好別人_您必須照顧的5個基本數據

照顧好自己才能照顧好別人I am pretty sure that on your data journey you came across some courses, videos, articles, maybe use cases where someone takes some data, builds a classification/regression model, shows you great results, you learn how that model wo…

matlab數字仿真實驗,DVR+備用電源自動投入的MATLAB數字仿真實驗仿真實驗

一、動態電壓恢復器(DVR)的數字仿真實驗動態電壓恢復器(Dynamic Voltage Restorer&#xff0c;DVR)是一種基于電力電子技術的串聯補償裝置&#xff0c;通常安裝在電源與敏感負荷之間&#xff0c;其作用在于&#xff1a;保證電網供電質量&#xff0c;補償供電電網產生的電壓跌落…

c#,xp系統,Matlab6.5

編譯環境&#xff1a;c#&#xff0c;xp系統&#xff0c;Matlab6.5 新建一個窗體項目&#xff0c;添加matlab引用。 然后試了四種方式調用matlab&#xff1a; 第一種 view plaincopy to clipboardprint?MLApp.MLAppClass matlab new MLApp.MLAppClass(); matlab.Visible 1;…

java script 對象

java script 對象 1.創建方式 1&#xff09;通過字面量的形式創建 例&#xff1b;var stt{x:1,y:2,y:3}; 或&#xff1b;var stt{ x:1, y:2, for:3 } 注意關鍵字必須放到引號中間 2&#xff09;通過new創建對象 例&#xff1a;var new stt(); stt.name 小魚; stt.age 20…

認識數據分析_認識您的最佳探索數據分析新朋友

認識數據分析Visualization often plays a minimal role in the data science and model-building process, yet Tukey, the creator of Exploratory Data Analysis, specifically advocated for the heavy use of visualization to address the limitations of numerical indi…

架構探險筆記10-框架優化之文件上傳

確定文件上傳使用場景 通常情況下&#xff0c;我們可以通過一個form&#xff08;表單&#xff09;來上傳文件&#xff0c;就以下面的“創建客戶”為例來說明&#xff08;對應的文件名是customer_create.jsp&#xff09;&#xff0c;需要提供一個form&#xff0c;并將其enctype屬…

matlab飛行數據仿真,基于MATLAB的飛行仿真

收稿日期: 2005 - 05 - 15   第 23卷  第 06期 計  算  機  仿  真 2006年 06月    文章編號: 1006 - 9348 (2006) 06 - 0057 - 05 基于 MATLAB的飛行仿真 張鐳 ,姜洪洲 ,齊潘國 ,李洪人 (哈爾濱工業大學電液伺服仿真及試驗系統研究所 ,黑龍江 哈爾濱 150001) 摘要:該…

Windows Server 2003 DNS服務安裝篇

導讀-- DNS(Domain Name System&#xff0c;域名系統)是一種組織成層次結構的分布式數據庫&#xff0c;里面包含有從DNS域名到各種數據類型(如IP地址)的映射“貴有恒&#xff0c;何必三更起五更勤;最無益&#xff0c;只怕一日曝十日寒。”前一段時間巴哥因為一些生活瑣事而中止…

正則表達式matlab,正則表達式中一個word的匹配?@MATLAB - 優秀的Free?OS(Linux)版 - 北大未名BBS...

我目前想做的就是判斷一個str是否可以被認為是有效的MATLAB index。最好的方法是直接運行&#xff0c;然后看運行結果或報錯類型&#xff0c;但是我不打算在不知道是什么類型的東西之前運行它&#xff0c;所以可以預先parse一下&#xff0c;簡單判斷是否“長得跟有效的MATLAB i…

arima模型怎么擬合_7個統計測試,用于驗證和幫助擬合ARIMA模型

arima模型怎么擬合什么是ARIMA&#xff1f; (What is ARIMA?) ARIMA models are one of the most classic and most widely used statistical forecasting techniques when dealing with univariate time series. It basically uses the lag values and lagged forecast error…