欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2014年09月04日 16:34:39   投稿:shichen2014  
這篇文章主要介紹了MFC程序執(zhí)行過程,包括對(duì)MFC執(zhí)行流程的分析以及斷點(diǎn)調(diào)試分析出的SDI程序執(zhí)行流程,需要的朋友可以參考下

本文較為詳細(xì)的分析了VC++程序設(shè)計(jì)的MFC程序執(zhí)行過程,有助于加深對(duì)MFC程序運(yùn)行原理的理解。分享給大家供大家參考之用。具體分析如下:

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

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

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

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

4)隨后調(diào)用CWinApp::InitInstance成員函數(shù),在這個(gè)成員函數(shù)當(dāng)中,使用new操作在堆上聲明一個(gè)框架窗口對(duì)象,由此導(dǎo)致框架窗口對(duì)象的構(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ù),在這個(gè)函數(shù)當(dāng)中由MFC注冊(cè)幾個(gè)默認(rèn)的WNDCLASS供框架窗口的Create使用。這時(shí)程序控制權(quán)交還給CWinApp::InitInstance成員函數(shù)內(nèi)部,由這個(gè)函數(shù)調(diào)用CWnd::ShowWindow顯示窗口并且調(diào)用CWnd::UpdateWindow向窗口發(fā)送WM_PAINT消息。調(diào)用完CWinApp::InitInstance成員函數(shù)后由AfxWinMain函數(shù)調(diào)用CWinApp::Run成員函數(shù),并由這個(gè)函數(shù)來創(chuàng)建和處理消息循環(huán),并且在沒有消息的時(shí)候處理OnIdle空閑處理。至此整個(gè)程序的創(chuàng)建過程完成。

5)在程序的運(yùn)行過程當(dāng)中,由操作系統(tǒng)源源不斷的發(fā)送消息給應(yīng)用程序,并且由CWinApp::Run當(dāng)中的消息循環(huán)處理并且分發(fā)給相關(guān)的窗口對(duì)象的DefWindowProc成員函數(shù),并由這個(gè)成員函數(shù)查詢窗口對(duì)象的消息映射表,如果查到對(duì)應(yīng)項(xià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)用程序接受到這個(gè)消息以后的默認(rèn)操作是調(diào)用PostQuitMessage函數(shù),由這個(gè)函數(shù)發(fā)送WM_QUIT消息。當(dāng)程序?qū)ο蠼邮艿絎M_QUIT消息后消息循環(huán)結(jié)束,由AfxWinMain函數(shù)調(diào)用AfxTerm函數(shù)清理程序使用過的資源并且結(jié)束整個(gè)程序。

小結(jié):以上的所有描述涵蓋了一個(gè)程序從開始、運(yùn)行到結(jié)束的所有過程。 相信大家有點(diǎn)暈點(diǎn)了吧,實(shí)際編程中沒有必要深刻理解這么多,這些大都是由MFC內(nèi)部自動(dòng)幫我們完成的。實(shí)際MFC編程過程中,其實(shí)懂得MFC程序中各個(gè)函數(shù)的執(zhí)行流程即可。有時(shí)候過于追究MFC細(xì)節(jié)會(huì)白白浪費(fèi)我們的精力,應(yīng)該將主要精力放在使用MFC解決實(shí)際問題上。

二 VC6中SDI程序的執(zhí)行流程

下面以VC6中的sdi工程為例,通過給每個(gè)函數(shù)前設(shè)置斷點(diǎn)后調(diào)式執(zhí)行,可以看出MFC的SDI的執(zhí)行流程。記錄如下,希望對(duì)MFC執(zhí)行有疑惑的人有幫助。

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
// ---------------- 關(guān)閉窗口后-------------------------------------
12) CSdiView::~CSdiView()
13) CMainFrame::~CMainFrame()
14) CSdiDoc::~CSdiDoc()

感興趣的朋友可以采用斷點(diǎn)調(diào)試測(cè)試一下SDI程序的執(zhí)行流程,以加深對(duì)MFC運(yùn)行原理的理解,從而更好的掌握Windows程序設(shè)計(jì)。

相關(guān)文章

  • QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用

    QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用

    在這篇文章中,你將知道水平布局、垂直布局、網(wǎng)格布局如何輕松上手,以純代碼方式展示。對(duì)齊方式,大小設(shè)置,圖片頭像匹配標(biāo)簽,布局器里面的組件大小隨意切換大小,認(rèn)真看完這篇文章,QT布局管理器熟練使用
    2022-06-06
  • C語(yǔ)言數(shù)組學(xué)習(xí)之特殊矩陣的壓縮存儲(chǔ)

    C語(yǔ)言數(shù)組學(xué)習(xí)之特殊矩陣的壓縮存儲(chǔ)

    矩陣在計(jì)算機(jī)圖形學(xué)、工程計(jì)算中都占有舉足輕重的地位,本文將討論如何將矩陣更有效地存儲(chǔ)在內(nèi)存中,并且能夠方便地提取矩陣中的元素。感興趣的同學(xué)可以了解一下
    2021-12-12
  • C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))

    C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(208.實(shí)現(xiàn)字典樹(前綴樹)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    vs2019配置Qt5開發(fā)環(huán)境(圖文教程)

    本文主要介紹了如何使用visual studi2019配置qt5開發(fā)環(huán)境,以及創(chuàng)建qt項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語(yǔ)言代碼實(shí)現(xiàn)井字棋游戲

    C語(yǔ)言代碼實(shí)現(xiàn)井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語(yǔ)言員工信息管理系統(tǒng)源代碼

    C語(yǔ)言員工信息管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言員工信息管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++實(shí)現(xiàn)正態(tài)隨機(jī)分布的方法

    C++實(shí)現(xiàn)正態(tài)隨機(jī)分布的方法

    本篇介紹了,使用c++實(shí)現(xiàn)正態(tài)隨機(jī)分布的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • C++全面細(xì)致講解復(fù)數(shù)類

    C++全面細(xì)致講解復(fù)數(shù)類

    本文章向大家介紹C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類,主要包括C++ 標(biāo)準(zhǔn)庫(kù)中的復(fù)數(shù)類使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-06-06
  • Qt 實(shí)現(xiàn)桌面雪花飄落代碼

    Qt 實(shí)現(xiàn)桌面雪花飄落代碼

    這篇文章主要介紹了Qt實(shí)現(xiàn)桌面雪花飄落代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++中const應(yīng)放在類型前還是后

    C++中const應(yīng)放在類型前還是后

    之前遇到小伙伴問C++中const加在類型名前和變量名前的區(qū)別,今天給大家簡(jiǎn)單分析下。
    2016-05-05

最新評(píng)論