2023年MFC初窺MFC運行機(jī)制孫鑫C第三講筆記_第1頁
2023年MFC初窺MFC運行機(jī)制孫鑫C第三講筆記_第2頁
2023年MFC初窺MFC運行機(jī)制孫鑫C第三講筆記_第3頁
2023年MFC初窺MFC運行機(jī)制孫鑫C第三講筆記_第4頁
2023年MFC初窺MFC運行機(jī)制孫鑫C第三講筆記_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論