一.sdk應用程式與mfc應用程式執行過程的對比
程式執行都要有入口函式,在之前的
c++教程中都是main函式,而
windows應用程式的入口函式是winmain函式
,mfc程式也是從winmain函式開始的
。下面雞啄公尺就給出用
windows sdk寫的「helloworld」程式,與mfc應用程式
框架進行對比
,這樣能更好的了解框架是怎樣執行的。
windows sdk開發程式就是不使用mfc類庫,直接用windows api函式進行軟體開發
。雞啄公尺不是要講解sdk開發,只是為了對比而簡單介紹,至於sdk開發可以在大家學完mfc以後選擇是否要研究,一般來說有簡單了解就可以了。
sdk應用程式
首先,給出windows sdk應用程式「helloworld」的原始碼:
c++**
#include
lresult
callback mywndproc(
hwnd
hwindow,
uint
msg,
wparam
wparam,
lparam
lparam);
intwinapi winmain(
hinstance
hinstance,
hinstance
hprevinstance,
pstr
szcmdline,
inticmdshow)
return
(int
)msg.wparam;
}
}
lresult
callback mywndproc(
hwnd
hwindow,
uint
msg,
wparam
wparam,
lparam
lparam)
else
if(msg==wm_destroy)
return
defwindowproc(hwindow,msg,wparam,lparam);
}
上面的程式執行的流程是:進入winmain函式->
初始化wndclas***
,呼叫registerclas***函式註冊視窗類
->呼叫
showwindow和updatewindow函式顯示並更新視窗
->進入訊息迴圈
。關於訊息迴圈再簡單說下,
windows應用程式是訊息驅動的
,系統或使用者讓應用程式進行某項操作或完成某個任務時會傳送訊息,
進入程式的訊息佇列,然後訊息迴圈會將訊息佇列中的訊息取出,交予相應的視窗過程處理,此程式的視窗過程函式
就是mywndproc函式
,視窗過程函式處理完訊息就完成了某項操作或任務。本例是要顯示「hello world」字串,
updatewindow函式會傳送wm_paint訊息
,但是此訊息不經過訊息佇列而是直接送到視窗過程處理,在視窗過程函式中最終繪製了「hello world」字串。
mfc應用程式
下面是mfc應用程式的執行流程,通過mfc庫中**進行分析:首先。
c++**
extern
"c"int
winapi
_twinmain(
hinstance
hinstance,
hinstance
hprevinstance,
_in_
lptstr
lpcmdline,
intncmdshow)
#pragma warning(suppress: 4985)
在tchar.h中,有此定義:#define _twinmainwinmain,所以這裡的_twinmain就是winmain函式
。它呼叫了afxwinmain函式(位於winmain.cpp中)。
c++**
intafxapi afxwinmain(
hinstance
hinstance,
hinstance
hprevinstance,
lptstr
lpcmdline,
intncmdshow)
// run函式
位於thrdcore.cpp中,由此函式進入訊息迴圈
nreturncode = pthread->run();
..............略
return
nreturncode;
}
上面initinstance函式
的**如下:
c++**
bool
chelloworld
initinstance中的processshellcommand函式又
呼叫了cmainframe的loadframe函式註冊並建立了視窗,執行完processshellcommand函式以後,呼叫了m_pmainwnd的showwindow和updatewindow函式顯示並更新框架
視窗。這些是不是與上面的sdk程式十分類似?
接下來該是訊息迴圈了,上面的afxwinmain函式中呼叫了pthread的run函式(位於
thrdcore.cpp
中),在run中包含了訊息迴圈。run函式的**如下:
c++**
intcwinthread::run()
} while
(::peekmessage(&m_msgcur, null, null, null, pm_noremove));
..............略
}
bool
cwinthread::pumpmessage()
bool
afxapi afxinternalpumpmessage()
...............略
if(pstate->m_msgcur.message != wm_kickidle && !afxpretranslatemessage(&(pstate->m_msgcur)))
return
true;
}
我們看到
pumpmessage中通過呼叫getmessage、translatemessage、dispatchmessage等建立了訊息迴圈並投遞訊息。
視窗過程函式afxwinproc形式如下:
c++**
lresult
callback afxwndproc(
hwnd
hwnd,
uint
nmsg,
wparam
wparam,
lparam
lparam)
兩者執行過程對比
到此,通過對比可以發現,mfc應用程式的執行流程與sdk程式是類似的,都是先進行一些
初始化過程,再註冊並建立視窗,然後顯示、更新視窗,
最後進入訊息迴圈,訊息都由視窗過程
函式處理。現在大家是不是覺得有些頭緒了?在執行流程上有基本的掌握即可。
二.
mfc應用程式框架主要類之間的關係
在第二講中,給大家演示了如何利用應用程式嚮導生成單文件應用程式框架,可以看到程式的基本框架
雞啄公尺就四個主要類的關係簡單講下,
。cmainframe是檢視chelloworldview的父視窗,檢視chelloworldview就顯示在cmainframe的客戶區中
。檢視類chelloworldview用來顯示文件類chelloworlddoc中的資料,並根據對檢視類的操作修改文件類的資料
。乙個檢視類只能跟乙個文件類相聯絡,而乙個文件類可以跟多個檢視類相聯絡
。關於檢視類和文件類的關係後面會詳細講解。
MFC應用程式呼叫順序分析
開發環境 visual studio 2010 了解乙個程式的呼叫關係和呼叫順序,對乙個程式設計人員來說是有必要的。下面將會以 visual studio 2010 第乙個visual c net程式 為例子進行分析。首先,通過 類檢視 檢視本專案所包含的類,如圖1所示。圖1 類檢視 利用 解決方案...
MFC 應用程式框架 程式入口和執行流程
第一部分 木木的家園,在此表示感謝!一 mfc程式執行過程剖析 下面以vc6中的sdi工程為例,通過給每個函式前設定斷點後調式執行,可以看出mfc的sdi的執行流程。記錄如下,希望對mfc執行有疑惑的人有幫助。cpp view plain copy 3 bool 4 csdidoc csdidoc ...
應用程式框架實戰三 什麼是應用程式框架
什麼是應用程式框架?正如框架是架構的具體實現一樣,應用程式框架是應用程式架構的具體實現。不過這樣說了等於沒說,因為框架和架構都是如此抽象。為了獲得直觀的感受,下面先看看更具體的.net framework和第三方框架。net framework為.net程式設計師提供了乙個龐大的類庫,幾乎任何開發任...