版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
有了一定的Windows32編程知識,就能學(xué)習(xí)MFC了。
在學(xué)習(xí)MFC之前,一定要弄明白Wind。ws32編程中的消息循環(huán)是
怎么回事。MFC事實上就是對WindowsAPI函數(shù)的封裝。
在Windows程序設(shè)計編程中,創(chuàng)建一個窗口要經(jīng)歷下面四個過程(如
有不懂,請看博客win32初窺)
1設(shè)計一個窗口類;
2注冊窗口類;
3創(chuàng)建窗口;
4顯示及更新窗口。
同樣,MFC中也是同樣的。只是封裝了而己,很多人認(rèn)為MFC很難
學(xué),看著書本能編程序,但是卻編寫不了自己的程序,為什么呢?由于
還沒有理解MFC的原理的機(jī)制。
市場上有很多有關(guān)VC++的書本,但是很少有將MFC原理講得比較
透徹的,引用孫鑫老師的話。
同樣的,WiriMain也是入口函數(shù),具體的過程,請看孫鑫視頻20講之
第三講
externintWINAPI
_tWinMain(HINSTfiNCEhlnstance,HINSTANCEhPreuInstance,
LPTSTRIpCmdLine,intnCmdShow)|
<
//callshared/exportedWinMain
returnAFxWinMain(hInstance,hPreuInstance,IpCmdLine,nCndShovi);
其中,孫鑫老師開始提出的一個問題是:
在全局變量中,定義一個子類對象。。。
「htrrviewplaincopy
1.#include<iostream>
2.#include<string>
3.usingnamespacestd;
4?
5.classPerson
6.{
7.public:
8.Person*p;
9.Person()
10.{
11.p=this;//保存this指針
12.}
13.virtualvoidsay()
14.(
15.cout<<"Person'ssay()"<<end1;
16.}
17.
18.};
19.
20.classStudent:pub1icPerson
21.{
22.pub1ic:
23.
24.Student()
25.{
26.
27.)
28.voidsay()
29.{
30.cout<<"Student'ssay()"<<end1;
31.}
32.
33.);
34.
35.Students;
36.
37.intmain()
38.{
39.
40.s.p->say()://這里將調(diào)用子類的方法
41.return0;
42.)
什么都不用做,直接用向?qū)梢粋€MFC窗口。
下面是結(jié)構(gòu)圖,有五個類
E{plVSunxinTestclasses
+飛CAboutDIg
+飛CMainFrame
+CVSunxinTestApp
+?i^CVSunxinfestbocj
+■qCVSunxinTestView
+口Globals
是這樣命名的,開頭的C表達(dá)Class,C+工程名+(App,Doc,Vi
ew...)
其中CMainFrame表達(dá)一個窗口(主窗體,涉及標(biāo)題欄,菜單...),
XXApp表達(dá)運用程序,XXDOC表達(dá)文檔類(加載數(shù)據(jù),實現(xiàn)數(shù)據(jù)的
存儲與操作分離),XXView也表達(dá)一個窗口(相稱于Windows的客戶
區(qū))
下面看看MFC中類的重要繼承關(guān)系:
由于繼承樹太大,這里只羅列了CWnd的繼承關(guān)系
WindowSupport
CWnd
FrameWindowsDialogBoxesViews
CFrameWnd-CDialogCView
-CMDIChildWnd-CCommonDialogCCtrlView
LuserMDIwindows-CColorDialogCEditView
-CMDIFrameWnd-CFileDialogCListView
LuserMDIworkspaces-CFindReplaceDialogCRichEditView
-CMiniFrameWndCFontDialog-CTreeView
-userSDIwindows-COleDialog-CScrollView
-COIelPFrameWndCOleBusyDialog-userscrollviews
-CSplitterWnd-COleChangelconDialog-CFormView
-userformviews
ControlBarsCOleChangeSourceDialog
-CControlBar-COleConvertDialog-CDaoRecordView
CDialogBarCOlelnsertDialogCHtmlView
-COleResizeBar-COleLinksDialog-COleDBRecordVii
-CReBarLcOleUpdateDialog-CRecordView
Luserrecordvi
-CStatusBar-COlePasteSpecialDialog
-CToolBar-COlePropertiesDialog
PropertySheetsCPageSetupDiaiog
CPropertySheet-CPrintDialog
l-CPropertySheetEx^COIePropertyPage
-CPropertyPage
LCPropertyPageEX
-userdialogboxes
APl中CreateWindowEx和CreateWindow幾乎是同樣
的,Ex表達(dá)擴(kuò)展,多了一個參數(shù)
下面用API模擬CWnd
just模擬
ml]viewp1aincopy
1.〃下面是模仿封裝API函數(shù)
2.
3.classCWnd
4.{
5.public:
6.BOOLCreateEX(
7.DWORDdwExSty1e,//extendedwindowstyle
8.LPCTSTR1pClassName^//registeredclassname
9.LPCTSTRIpWindowName,//windowname
10.DWORDdwStyle,//windowstyle
11.intx,//horizontalpositionofwindow
12.inty,//vertica1positionofwindow
13.intnWidth,//windowwidth
14.intnHeight,//windowheight
15.HWNDhWndParent,//handletoparentorownerwindow
16.HMENUhMenu,//menuhandleorchildidentifier
17.IIINSTANCEhlnstance,//handletoapp1icationinstance
18.LPVOIDIpParam//window-ereationdata
19.);
20.
21.BOOLShowWindow(intnCmdShow);
22.
23.B00LUpdateWindow();
24.
25.public:
26.HWNDm_hWnd:
27.):
28.
29-BOOLCWnd::CreateEx(
30.DWORDdwExSty1e,//extendedwindowstyle
31.LPCTSTRIpClassNamc,//registeredc1assname
32.LPCTSTRIpWindowName,//windowname
33.DWORDdwSty1e,//windowstyle
34.intx,//horizontalpositionofwindow
35.inty,//vertica1positionofwindow
36.intnWidth,//windowwidth
37.intnHeightj//windowheight
38.HWNDhWndParent,//handletoparentorownerw
ndow
39.HMENUhMenu,//menuhandIeorchildide
ntifier
40.HINSTANCEhlnstance}//handietoapplicationinstan
ce
41.LPVOIDIpParam//window-creationdata
42.)
43.{
44.m_hWnd=::CreateWindowEx(dwExsLy1e,IC1assName,1pWindowNa
me,dwStyle,x,y,nWidth,nHeight,hWndParent,
45.hMenu,hlnstance,1Param);
46.
47.if(m_hWnd!=NULL)
48.
49.returnTRUE;
50.e1se
51.returnFALSE;
52.}
53.
54.BOOLCWnd::ShowWindow(intnCmdShow)
55.{
56.return::ShowWindow(m—hWnd,nCmdShow);//調(diào)用的是SDK全局函數(shù),加個::
說明是全局的
57?)
58.
159.BOOLCWnd::UpdateWindow()
60.{
61.return::UpdateWindow(m_hWnd);
62.}
63.
64.intWINAPIWinMain(
65.HINSTANCEhlnstanee,//handletocurrentins
tance
66.HINSTANCEhPrevlnstance,//handletopr
eviousinstance
67.LPSTRIpCmdLine,//commandline
68.intnCmdShow//showstate
69.)
70.(
71.WNDCLASSwndclass;
72.
73.wndc1ass.cbClsExtra=0;
74.wndclass.cbWndExIra=0;
75.wndelass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BR
USH);
76.wndclass.hCursor=LoadCursorCNULL^IDC_ARROW);
77.wndclass.hlcon=LoadIcon(NULL,IDI_ERR0R);
78.wndclass.hlnstance=hInstanee;
79.???
80.
81.CWndcwnd;
82.cwnd.CreateEx(dwExsty1e
83.
84.cwnd.ShowWindow(nCmdShow);
85.cwnd.UpdateWindow();
86.
87.while(GetMessage(&msg,NULL,0,0))
88.(
89.TranslateMessage(&msg);
90.DispatchMessage(&msg);
91.)
92.
93.
94.}
F面是重頭戲(引用了某位仁兄的,太具體了)
重點:MFC運營機(jī)制AA提醒:對于不想理解內(nèi)部運營過程的,可以
不看這一章,可以看了后面的界面設(shè)計再回頭來看這一章,也許感覺更深
刻。A這一次課和上一次的課的重點就是MFC的窗口類創(chuàng)建過程,
而要反復(fù)說明的就是:MFC的程序和C語言的程序,從執(zhí)行原理上說,
是完全一致的。
抓住這一點,那么對于理解MFC程序的運營機(jī)制也就相對于簡樸
了。
C中的main函數(shù)就相稱于MFC中的WinMain函數(shù)。
感愛好的可以運用VC的斷點設(shè)立自己跟蹤下面講述的各個函數(shù),
就明白它的執(zhí)行順序了。AA—、C語言程序執(zhí)行環(huán)節(jié)A在C語言
中,大約的環(huán)節(jié)如下:
1,全局變量內(nèi)存分派
2,進(jìn)入main函數(shù)A
二、MFC程序的運營環(huán)節(jié)(重要是初始化)AA打開一個MF
CAPPWizard(exe)工程,跟蹤其執(zhí)行環(huán)節(jié),可以發(fā)現(xiàn),是以下
順序:1A)CXXApp中的全局變量定義ACXXApptheApp#2)
調(diào)用CXXApp構(gòu)造函數(shù)
CXXApp::CXXApp(){}
3)進(jìn)入Winmain函數(shù)JtWinMain為宏,值為WinMain)A
_tWinMain(){}
A4)完畢初始化工作:涉及窗口類注冊、窗口產(chǎn)生、顯示和更新
pThread—>lnitlnstance()AA對于MFC程序,Mai
nFrame,View,Too舊ar,ControIbar等都是窗口,所以下面的窗口
注冊與創(chuàng)建、顯示等要反復(fù)調(diào)用多次,一次相應(yīng)一個窗口A
(1)注冊窗口類A
AfxEndDeferRegisterClassiA(2)創(chuàng)建窗口AA
CMainFrame::PreCreateWindow()//反復(fù)調(diào)用一次是給我們修改
窗口屬性的機(jī)會
ACFrameWnd::Create()AA(3)消息循環(huán)A
PumpMessage()
補(bǔ)充1:AA在MFC中,由于涉及到(窗口)類定義,所以定義全
局變量的時候,需要進(jìn)行更多的環(huán)節(jié)。AA全局變量涉及到類定義(類
似于C中的類型定義)的話,那么需要遵循以下環(huán)節(jié)(以MFC的窗口
類為例)
1)設(shè)計一個窗口類A
2)注冊窗口類A3A)創(chuàng)建窗口A4A)顯示及更新窗口
45)消息循環(huán)
補(bǔ)充2:其他需要注意的幾點AA1,每一個MFC程序,有且只
有一個從WinApp類派生的類(應(yīng)用程序類),也只有一個從應(yīng)用程序
類所事例化的對象,表達(dá)應(yīng)用程序自身。在WIN32程序當(dāng)中,表達(dá)應(yīng)用
程序是通過WINMAIN入口函數(shù)來表達(dá)的(通過一個應(yīng)用程序的一個
事例號這一個標(biāo)記來表達(dá)的)。在基于MFC應(yīng)用程序中,是通過產(chǎn)生
一個應(yīng)用程序?qū)ο?,用它來唯一的表達(dá)了應(yīng)用程序。
42,_tWinMain函數(shù)中通過調(diào)用Ab<WinMain()函數(shù)來完畢它要完畢
的功能。(Afx*前綴代表這是應(yīng)用程序框架函數(shù),是一些全局函數(shù),應(yīng)
用程序框架是一套輔助生成應(yīng)用程序的框架模型,把一些類做一些有機(jī)
的集成,我們可根據(jù)這些類函數(shù)來設(shè)計自己的應(yīng)用程序)。AA3,
設(shè)計窗口類:在MFC中事先設(shè)計好了幾種缺省的窗口類,根據(jù)不同的應(yīng)
用程序的選擇,調(diào)用AfxEndDeferRegisterC1ass()函數(shù)注冊
所選擇的窗口類。&A4,PreCreateWindow。是個虛函數(shù),假
如子類有則調(diào)用子類的。
A5,CreateWindowEx()函數(shù)參數(shù)與CREATESTRU
CT結(jié)構(gòu)體成員完全一致,CreateWindowEx()函數(shù)與CREAT
ESTRUCT結(jié)構(gòu)體參數(shù)的相應(yīng)關(guān)系,使我們在創(chuàng)建窗口之前通過可Pr
eCreateWindow(cs)修改cs結(jié)構(gòu)體成員來修改所要的窗口外觀。
AA6,注意兩個函數(shù)。
A::Trans1ateMessage(&m_msgCur)函數(shù)進(jìn)行消息(如鍵
盤消息)轉(zhuǎn)換
④::DispatchMessage(&m—msgCur)函數(shù)分派消息到窗口的
回調(diào)函數(shù)解決(事實上分派的消息通過消息映射,交由消息響應(yīng)函數(shù)進(jìn)
行解決。)
7,可以認(rèn)為View類窗口是CMainFram類窗口的子窗口。DOC
ument類是文檔類。DOC—VIEW結(jié)構(gòu)將數(shù)據(jù)自身與它的顯示分離
開。
文檔類用于數(shù)據(jù)的存儲,加載;視類用于數(shù)據(jù)的顯示,修改A
8,CTEApp::InitInstance()函數(shù)中通過文檔模板將文檔
類,視類,框架類的有機(jī)組織一起。語句如下:
CSing1eDocTemplate*pDocTemplate?pDo
cTemplate=newCSingleDocTemp1ate(AIDR_MAIN
FRAME,ARUNTIME_CLASS(CTEDoc),
RUNTIME_CLASS(CMainFrame),//mainSDIframe
windowARUNTIME_CLASS(CTEView));
AddDocTemplate(pDocTemp1ate);〃增長到模板A
補(bǔ)充3:本課涉及到MFC函數(shù)的源文獻(xiàn)位置A4根目錄A
找到您安裝VC98下MFC的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 印刷合股合同范本
- 西點烘焙制作工藝規(guī)范
- 微生物學(xué)檢驗技術(shù) 課件 28項目二十八:病原性真菌鑒定
- 內(nèi)褲供應(yīng)合同范本
- 社工站進(jìn)展情況匯報
- 六一兒童節(jié)活動策劃
- 管道轉(zhuǎn)讓合同范本
- 個貸款合同范本
- 空調(diào)保潔合同范本
- 2024年江蘇省高中學(xué)業(yè)水平合格性考試數(shù)學(xué)試卷試題(答案詳解1)
- 2024年中國郵政集團(tuán)有限公司校園招聘考試試題及參考答案
- 認(rèn)識城市軌道交通安全管理講解
- 場內(nèi)運輸機(jī)械檢查驗收表
- 不銹鋼加工檢驗標(biāo)準(zhǔn)
- 泰國投資指導(dǎo)手冊
- 2024年新華社招聘筆試參考題庫附帶答案詳解
- 全國初中數(shù)學(xué)青年教師優(yōu)質(zhì)課一等獎《反比例函數(shù)的圖象和性質(zhì)》課件
- (高清版)DZT 0265-2014 遙感影像地圖制作規(guī)范(1:50000、1:250000)
- 汽車直播活動策劃方案范文
- 2024中考復(fù)習(xí)必背初中英語單詞詞匯表(蘇教譯林版)
評論
0/150
提交評論