MFC視圖結(jié)構(gòu)框架分析教學(xué)資料_第1頁
MFC視圖結(jié)構(gòu)框架分析教學(xué)資料_第2頁
MFC視圖結(jié)構(gòu)框架分析教學(xué)資料_第3頁
MFC視圖結(jié)構(gòu)框架分析教學(xué)資料_第4頁
MFC視圖結(jié)構(gòu)框架分析教學(xué)資料_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。MFC視圖結(jié)構(gòu)框架分析MFC文檔視圖結(jié)構(gòu)框架分析1:程序的“導(dǎo)火索”theAppCmyApptheApp;在聲明對象的同時,調(diào)用其構(gòu)造函數(shù)。按C+的語法,首先要調(diào)用其基類Cwinapp的構(gòu)造函數(shù).這個文件主要用于應(yīng)用程序的一些初始化操作。classCWinApp:publicCWinThreadDECLARE_DYNAMIC(CWinApp)public:/ConstructorCWinApp(LPCTSTRlpszAppName=NULL);CWinApp:CWinApp(LPCTSTRlpszApp

2、Name)if(lpszAppName!=NULL)m_pszAppName=_tcsdup(lpszAppName);elsem_pszAppName=NULL;/initializeCWinThreadstateAFX_MODULE_STATE*pModuleState=_AFX_CMDTARGET_GETSTATE();AFX_MODULE_THREAD_STATE*pThreadState=pModuleState-m_thread;ASSERT(AfxGetThread()=NULL);pThreadState-m_pCurrentWinThread=this;ASSERT(AfxG

3、etThread()=this);m_hThread=:GetCurrentThread();m_nThreadID=:GetCurrentThreadId();/initializeCWinAppstateASSERT(afxCurrentWinApp=NULL);/onlyoneCWinAppobjectpleasepModuleState-m_pCurrentWinApp=this;ASSERT(AfxGetApp()=this);/innon-runningstateuntilWinMainm_hInstance=NULL;m_hLangResourceDLL=NULL;m_pszHe

4、lpFilePath=NULL;m_pszProfileName=NULL;m_pszRegistryKey=NULL;m_pszExeName=NULL;m_pRecentFileList=NULL;m_pDocManager=NULL;m_atomApp=m_atomSystemTopic=NULL;m_lpCmdLine=NULL;m_pCmdInfo=NULL;/initializewaitcursorstatem_nWaitCursorCount=0;m_hcurWaitCursorRestore=NULL;/initializecurrentprinterstatem_hDevMo

5、de=NULL;m_hDevNames=NULL;m_nNumPreviewPages=0;/notspecified(defaultsto1)/initializeDAOstatem_lpfnDaoTerm=NULL;/willbesetifAfxDaoInitcalled/otherinitializationm_bHelpMode=FALSE;m_eHelpType=afxWinHelp;m_nSafetyPoolSize=512;/defaultsize2:theApp之后的隱藏代碼,由他控制整個程序的流程。_tWinMain(HINSTANCEhInstance,HINSTANCEh

6、PrevInstance,LPTSTRlpCmdLine,intnCmdShow)/callshared/exportedWinMainreturnAfxWinMain(hInstance,hPrevInstance,lpCmdLine,nCmdShow);其中有宏定義:#define_tWinMainwWinMainintAFXAPIAfxWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)ASSERT(hPrevInstance=NULL);intnReturnCode=-1;CWinT

7、hread*pThread=AfxGetThread();;/CWinApp是從CWinThread派生的,CWinApp*pApp=AfxGetApp();/實質(zhì)上就是pThread=pApp/AFXinternalinitializationif(!AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow)/用于初始化gotoInitFailure;/Appglobalinitializations(rare)if(pApp!=NULL&!pApp-InitApplication()/用于初始化gotoInitFailure;/Perfor

8、mspecificinitializationsif(!pThread-InitInstance()/注意多態(tài)性virtualBOOLInitInstance();/又因為pThread=pApp,所以調(diào)用pApp-InitInstance()if(pThread-m_pMainWnd!=NULL)TRACE(traceAppMsg,0,Warning:Destroyingnon-NULLm_pMainWndn);pThread-m_pMainWnd-DestroyWindow();nReturnCode=pThread-ExitInstance();gotoInitFailure;nRetu

9、rnCode=pThread-Run();/控制消息循環(huán)InitFailure:#ifdef_DEBUG/CheckformissingAfxLockTempMapcallsif(AfxGetModuleThreadState()-m_nTempMapLock!=0)TRACE(traceAppMsg,0,Warning:Tempmaplockcountnon-zero(%ld).n,AfxGetModuleThreadState()-m_nTempMapLock);AfxLockTempMaps();AfxUnlockTempMaps(-1);#endifAfxWinTerm();retur

10、nnReturnCode;由上面的程序可以看到幾個很重要的函數(shù)(1)AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow)gotoInitFailure;(2)pApp-InitApplication()(3)pThread-InitInstance()(4)pThread-Run()其中1,2也是完成程序的一些初始化工作,4主要是為了處理消息,3呢,很關(guān)鍵,我們運(yùn)行時看到的窗口就是從這里產(chǎn)生。下面一一介紹3:程序自動產(chǎn)生的InitInstance()函數(shù)以下是自動生成的InitInstance()源程序:BOOLCmyApp:InitIn

11、stance()/如果一個運(yùn)行在WindowsXP上的應(yīng)用程序清單指定要/使用ComCtl32.dll版本6或更高版本來啟用可視化方式,/則需要InitCommonControls()。否則,將無法創(chuàng)建窗口。InitCommonControls();CWinApp:InitInstance();/初始化OLE庫if(!AfxOleInit()AfxMessageBox(IDP_OLE_INIT_FAILED);returnFALSE;AfxEnableControlContainer();/標(biāo)準(zhǔn)初始化/如果未使用這些功能并希望減小/最終可執(zhí)行文件的大小,則應(yīng)移除下列/不需要的特定初始化例程/更

12、改用于存儲設(shè)置的注冊表項/TODO:應(yīng)適當(dāng)修改該字符串,/例如修改為公司或組織名SetRegistryKey(_T(應(yīng)用程序向?qū)傻谋镜貞?yīng)用程序);LoadStdProfileSettings(4);/加載標(biāo)準(zhǔn)INI文件選項(包括MRU)/注冊應(yīng)用程序的文檔模板。文檔模板/將用作文檔、框架窗口和視圖之間的連接CMultiDocTemplate*pDocTemplate;pDocTemplate=newCMultiDocTemplate(IDR_myTYPE,RUNTIME_CLASS(CmyDoc),RUNTIME_CLASS(CChildFrame),/自定義MDI子框架RUNTIME_C

13、LASS(CmyView);if(!pDocTemplate)returnFALSE;AddDocTemplate(pDocTemplate);/創(chuàng)建主MDI框架窗口CMainFrame*pMainFrame=newCMainFrame;if(!pMainFrame|!pMainFrame-LoadFrame(IDR_MAINFRAME)returnFALSE;m_pMainWnd=pMainFrame;/僅當(dāng)具有后綴時才調(diào)用DragAcceptFiles/在MDI應(yīng)用程序中,這應(yīng)在設(shè)置m_pMainWnd之后立即發(fā)生/分析標(biāo)準(zhǔn)外殼命令、DDE、打開文件操作的命令行CCommandLineIn

14、focmdInfo;ParseCommandLine(cmdInfo);/調(diào)度在命令行中指定的命令。如果/用/RegServer、/Register、/Unregserver或/Unregister啟動應(yīng)用程序,則返回FALSE。if(!ProcessShellCommand(cmdInfo)/引發(fā)窗口注冊returnFALSE;/主窗口已初始化,因此顯示它并對其進(jìn)行更新pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow();returnTRUE;其中,注冊窗口用到了一下函數(shù),比較長,如下:BOOLAFXAPIAfxEndDefe

15、rRegisterClass(LONGfToRegister)/maskoffallclassesthatarealreadyregisteredAFX_MODULE_STATE*pModuleState=AfxGetModuleState();fToRegister&=pModuleState-m_fRegisteredClasses;if(fToRegister=0)returnTRUE;LONGfRegisteredClasses=0;/commoninitializationWNDCLASSwndcls;memset(&wndcls,0,sizeof(WNDCLASS);/startw

16、ithNULLdefaultswndcls.lpfnWndProc=DefWindowProc;/窗口處理函數(shù)wndcls.hInstance=AfxGetInstanceHandle();wndcls.hCursor=afxData.hcurArrow;INITCOMMONCONTROLSEXinit;init.dwSize=sizeof(init);/worktoregisterclassesasspecifiedbyfToRegister,populatefRegisteredClassesaswegoif(fToRegister&AFX_WND_REG)/Childwindows-no

17、brush,noicon,safestdefaultclassstyleswndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;wndcls.lpszClassName=_afxWnd;if(AfxRegisterClass(&wndcls)fRegisteredClasses|=AFX_WND_REG;if(fToRegister&AFX_WNDOLECONTROL_REG)/OLEControlwindows-useparentDCforspeedwndcls.style|=CS_PARENTDC|CS_DBLCLKS|CS_HREDRAW|CS_VR

18、EDRAW;wndcls.lpszClassName=_afxWndOleControl;if(AfxRegisterClass(&wndcls)fRegisteredClasses|=AFX_WNDOLECONTROL_REG;if(fToRegister&AFX_WNDCONTROLBAR_REG)/Controlbarwindowswndcls.style=0;/controlbarsdonthandledoubleclickwndcls.lpszClassName=_afxWndControlBar;wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE

19、+1);if(AfxRegisterClass(&wndcls)fRegisteredClasses|=AFX_WNDCONTROLBAR_REG;if(fToRegister&AFX_WNDMDIFRAME_REG)/MDIFramewindow(alsousedforsplitterwindow)wndcls.style=CS_DBLCLKS;wndcls.hbrBackground=NULL;if(_AfxRegisterWithIcon(&wndcls,_afxWndMDIFrame,AFX_IDI_STD_MDIFRAME)fRegisteredClasses|=AFX_WNDMDI

20、FRAME_REG;if(fToRegister&AFX_WNDFRAMEORVIEW_REG)/SDIFrameorMDIChildwindowsorviews-normalcolorswndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;wndcls.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);if(_AfxRegisterWithIcon(&wndcls,_afxWndFrameOrView,AFX_IDI_STD_FRAME)fRegisteredClasses|=AFX_WNDFRAMEORVIEW_REG;if

21、(fToRegister&AFX_WNDCOMMCTLS_REG)/thisflagiscompatiblewiththeoldInitCommonControls()APIinit.dwICC=ICC_WIN95_CLASSES;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WIN95CTLS_MASK);fToRegister&=AFX_WIN95CTLS_MASK;if(fToRegister&AFX_WNDCOMMCTL_UPDOWN_REG)init.dwICC=ICC_UPDOWN_CLASS;fRegisteredCla

22、sses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_UPDOWN_REG);if(fToRegister&AFX_WNDCOMMCTL_TREEVIEW_REG)init.dwICC=ICC_TREEVIEW_CLASSES;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_TREEVIEW_REG);if(fToRegister&AFX_WNDCOMMCTL_TAB_REG)init.dwICC=ICC_TAB_CLASSES;fRegisteredClasses|=

23、_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_TAB_REG);if(fToRegister&AFX_WNDCOMMCTL_PROGRESS_REG)init.dwICC=ICC_PROGRESS_CLASS;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_PROGRESS_REG);if(fToRegister&AFX_WNDCOMMCTL_LISTVIEW_REG)init.dwICC=ICC_LISTVIEW_CLASSES;fRegisteredClasses|=_

24、AfxInitCommonControls(&init,AFX_WNDCOMMCTL_LISTVIEW_REG);if(fToRegister&AFX_WNDCOMMCTL_HOTKEY_REG)init.dwICC=ICC_HOTKEY_CLASS;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_HOTKEY_REG);if(fToRegister&AFX_WNDCOMMCTL_BAR_REG)init.dwICC=ICC_BAR_CLASSES;fRegisteredClasses|=_AfxInitCommo

25、nControls(&init,AFX_WNDCOMMCTL_BAR_REG);if(fToRegister&AFX_WNDCOMMCTL_ANIMATE_REG)init.dwICC=ICC_ANIMATE_CLASS;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_ANIMATE_REG);if(fToRegister&AFX_WNDCOMMCTL_INTERNET_REG)init.dwICC=ICC_INTERNET_CLASSES;fRegisteredClasses|=_AfxInitCommonCon

26、trols(&init,AFX_WNDCOMMCTL_INTERNET_REG);if(fToRegister&AFX_WNDCOMMCTL_COOL_REG)init.dwICC=ICC_COOL_CLASSES;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_COOL_REG);if(fToRegister&AFX_WNDCOMMCTL_USEREX_REG)init.dwICC=ICC_USEREX_CLASSES;fRegisteredClasses|=_AfxInitCommonControls(&ini

27、t,AFX_WNDCOMMCTL_USEREX_REG);if(fToRegister&AFX_WNDCOMMCTL_DATE_REG)init.dwICC=ICC_DATE_CLASSES;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_DATE_REG);if(fToRegister&AFX_WNDCOMMCTL_LINK_REG)init.dwICC=ICC_LINK_CLASS;fRegisteredClasses|=_AfxInitCommonControls(&init,AFX_WNDCOMMCTL_L

28、INK_REG);/savenewstateofregisteredcontrolspModuleState-m_fRegisteredClasses|=fRegisteredClasses;/specialcaseforallcommoncontrolsregistered,turnonAFX_WNDCOMMCTLS_REGif(pModuleState-m_fRegisteredClasses&AFX_WIN95CTLS_MASK)=AFX_WIN95CTLS_MASK)pModuleState-m_fRegisteredClasses|=AFX_WNDCOMMCTLS_REG;fRegi

29、steredClasses|=AFX_WNDCOMMCTLS_REG;/musthaveregisteredatleastasmamyclassesasrequestedreturn(fToRegister&fRegisteredClasses)=fToRegister;他是在PreCreateWindow中調(diào)用的注冊,BOOLCFrameWnd:PreCreateWindow(CREATESTRUCT&cs)if(cs.lpszClass=NULL)VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);cs.lpszClass=_afxWn

30、dFrameOrView;/COLOR_WINDOWbackgroundif(cs.style&FWS_ADDTOTITLE)cs.style|=FWS_PREFIXTITLE;cs.dwExStyle|=WS_EX_CLIENTEDGE;returnTRUE;BOOLCMainFrame:PreCreateWindow(CREATESTRUCT&cs)if(!CFrameWnd:PreCreateWindow(cs)returnFALSE;/TODO:ModifytheWindowclassorstylesherebymodifying/theCREATESTRUCTcsreturnTRUE

31、;BOOLCView:PreCreateWindow(CREATESTRUCT&cs)ASSERT(cs.style&WS_CHILD);if(cs.lpszClass=NULL)VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);cs.lpszClass=_afxWndFrameOrView;/COLOR_WINDOWbackgroundif(cs.style&WS_BORDER)cs.dwExStyle|=WS_EX_CLIENTEDGE;cs.style&=WS_BORDER;returnTRUE;BOOLCTestView:PreC

32、reateWindow(CREATESTRUCT&cs)/TODO:ModifytheWindowclassorstylesherebymodifying/theCREATESTRUCTcsreturnCView:PreCreateWindow(cs);有幾點要說明(1)m_pMainWnd,頭文件里并沒有這個變量呀?噢,這個在基類里定義的public類型的變量,所以,他是通過繼承得到的。(2)你注意過嗎,當(dāng)我們一點運(yùn)行,會默認(rèn)出來一個視圖窗口,這是誰調(diào)用的呢?哦,就是下面這幾行,它調(diào)用了opendocument()函數(shù)。CCommandLineInfocmdInfo;ParseCommand

33、Line(cmdInfo);if(!ProcessShellCommand(cmdInfo)returnFALSE;(3)這個函數(shù)有個關(guān)鍵的地方CMultiDocTemplate*pDocTemplate;pDocTemplate=newCMultiDocTemplate(IDR_myTYPE,RUNTIME_CLASS(CmyDoc),RUNTIME_CLASS(CChildFrame),/自定義MDI子框架RUNTIME_CLASS(CmyView);if(!pDocTemplate)returnFALSE;AddDocTemplate(pDocTemplate);通過它,把視圖,窗口和文

34、檔結(jié)合起來。4:主窗口CMainFrame的創(chuàng)建(1)通過CMainFrame*pMainFrame=newCMainFrame;我們得到的是不斷調(diào)用的基類CMainFrame:CMainFrame()/TODO:在此添加成員初始化代碼CMDIFrameWnd:CMDIFrameWnd()m_hWndMDIClient=NULL;CFrameWnd:CFrameWnd()ASSERT(m_hWnd=NULL);m_nWindow=-1;/unknownwindowIDm_bAutoMenuEnable=TRUE;/autoenableonbydefaultm_lpfnCloseProc=NUL

35、L;m_hMenuDefault=NULL;m_hAccelTable=NULL;m_nIDHelp=0;m_nIDTracking=0;m_nIDLastMessage=0;m_pViewActive=NULL;m_cModalStack=0;/initializemodalitysupportm_phWndDisable=NULL;m_pNotifyHook=NULL;m_hMenuAlt=NULL;m_nIdleFlags=0;/noidleworkatstartm_rectBorder.SetRectEmpty();m_bHelpMode=HELP_INACTIVE;/notinShi

36、ft+F1helpmodem_dwPromptContext=0;m_pNextFrameWnd=NULL;/notinlistyetm_bInRecalcLayout=FALSE;m_pFloatingFrameClass=NULL;m_nShowDelay=-1;/nodelaypendingAddFrameWnd();(2)pMainFrame-LoadFrame(IDR_MAINFRAME)所引發(fā)的一系列BOOLCMDIFrameWnd:LoadFrame(UINTnIDResource,DWORDdwDefaultStyle,CWnd*pParentWnd,CCreateContex

37、t*pContext)if(!CFrameWnd:LoadFrame(nIDResource,dwDefaultStyle,pParentWnd,pContext)returnFALSE;/savemenutousewhennoactiveMDIchildwindowispresentASSERT(m_hWnd!=NULL);m_hMenuDefault=:GetMenu(m_hWnd);if(m_hMenuDefault=NULL)TRACE(traceAppMsg,0,Warning:CMDIFrameWndwithoutadefaultmenu.n);returnTRUE;BOOLCFr

38、ameWnd:LoadFrame(UINTnIDResource,DWORDdwDefaultStyle,CWnd*pParentWnd,CCreateContext*pContext)/onlydothisonceASSERT_VALID_IDR(nIDResource);ASSERT(m_nIDHelp=0|m_nIDHelp=nIDResource);m_nIDHelp=nIDResource;/IDforhelpcontext(+HID_BASE_RESOURCE)CStringstrFullString;if(strFullString.LoadString(nIDResource)

39、AfxExtractSubString(m_strTitle,strFullString,0);/firstsub-stringVERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);/attempttocreatethewindowLPCTSTRlpszClass=GetIconWndClass(dwDefaultStyle,nIDResource);CStringstrTitle=m_strTitle;if(!Create(lpszClass,strTitle,dwDefaultStyle,rectDefault,pParentWnd,MA

40、KEINTRESOURCE(nIDResource),0L,pContext)returnFALSE;/willselfdestructonfailurenormally/savethedefaultmenuhandleASSERT(m_hWnd!=NULL);m_hMenuDefault=:GetMenu(m_hWnd);/loadacceleratorresourceLoadAccelTable(MAKEINTRESOURCE(nIDResource);if(pContext=NULL)/sendinitialupdateSendMessageToDescendants(WM_INITIA

41、LUPDATE,0,0,TRUE,TRUE);returnTRUE;BOOLCFrameWnd:Create(LPCTSTRlpszClassName,LPCTSTRlpszWindowName,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,LPCTSTRlpszMenuName,DWORDdwExStyle,CCreateContext*pContext)HMENUhMenu=NULL;if(lpszMenuName!=NULL)/loadinamenuthatwillgetdestroyedwhenwindowgetsdestroyedHINSTA

42、NCEhInst=AfxFindResourceHandle(lpszMenuName,RT_MENU);if(hMenu=:LoadMenu(hInst,lpszMenuName)=NULL)TRACE(traceAppMsg,0,Warning:failedtoloadmenuforCFrameWnd.n);PostNcDestroy();/perhapsdeletetheC+objectreturnFALSE;m_strTitle=lpszWindowName;/savetitleforlaterif(!CreateEx(dwExStyle,lpszClassName,lpszWindo

43、wName,dwStyle,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,pParentWnd-GetSafeHwnd(),hMenu,(LPVOID)pContext)TRACE(traceAppMsg,0,Warning:failedtocreateCFrameWnd.n);if(hMenu!=NULL)DestroyMenu(hMenu);returnFALSE;returnTRUE;因為CFrameWnd沒有重新寫CreateEX,所以是調(diào)用的基類的CreateEx的函數(shù):BOOLCWnd:CreateEx(D

44、WORDdwExStyle,LPCTSTRlpszClassName,LPCTSTRlpszWindowName,DWORDdwStyle,intx,inty,intnWidth,intnHeight,HWNDhWndParent,HMENUnIDorHMenu,LPVOIDlpParam)/allowmodificationofseveralcommoncreateparametersCREATESTRUCTcs;cs.dwExStyle=dwExStyle;cs.lpszClass=lpszClassName;cs.lpszName=lpszWindowName;cs.style=dwSt

45、yle;cs.x=x;cs.y=y;cs.cx=nWidth;cs.cy=nHeight;cs.hwndParent=hWndParent;cs.hMenu=nIDorHMenu;cs.hInstance=AfxGetInstanceHandle();cs.lpCreateParams=lpParam;if(!PreCreateWindow(cs)PostNcDestroy();returnFALSE;AfxHookWindowCreate(this);HWNDhWnd=:CreateWindowEx(cs.dwExStyle,cs.lpszClass,cs.lpszName,cs.style

46、,cs.x,cs.y,cs.cx,cs.cy,cs.hwndParent,cs.hMenu,cs.hInstance,cs.lpCreateParams);#ifdef_DEBUGif(hWnd=NULL)TRACE(traceAppMsg,0,Warning:Windowcreationfailed:GetLastErrorreturns0 x%8.8Xn,GetLastError();#endifif(!AfxUnhookWindowCreate()PostNcDestroy();/cleanupifCreateWindowExfailstoosoonif(hWnd=NULL)return

47、FALSE;ASSERT(hWnd=m_hWnd);/shouldhavebeensetinsendmsghookreturnTRUE;可以看到,:CreateWindowEx是一個全局的函數(shù),在其中觸發(fā)WM_CREATE消息,進(jìn)而調(diào)用我們自己定義的CMainFrame:OnCreate()intCMainFrame:OnCreate(LPCREATESTRUCTlpCreateStruct)if(CMDIFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CH

48、ILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0(未能創(chuàng)建工具欄n);return-1;/未能創(chuàng)建if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)TRACE0(未能創(chuàng)建狀態(tài)欄n);return-1;/未能創(chuàng)建/TODO:如果不需要工具

49、欄可???,則刪除這三行m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return0;5:運(yùn)行后為什么能產(chǎn)生CMainFarme,文檔,視圖以及視圖外包圍的farme呢?你注意過嗎,當(dāng)我們一點運(yùn)行,會默認(rèn)出來一個視圖窗口,這是誰調(diào)用的呢?哦,就是下面這幾行,它調(diào)用voidCWinApp:OnFileNew()函數(shù).CCommandLineInfocmdInfo;ParseCommandLine(cmdInfo);if(!ProcessSh

50、ellCommand(cmdInfo)returnFALSE;你可以自己跟蹤以下。這里有個小技巧,你可以在BOOLCmyDoc:OnNewDocument()處設(shè)立斷點,然后“跳出”,最后你會達(dá)到起始點!ProcessShellCommand(cmdInfo)voidCWinApp:OnFileNew()if(m_pDocManager!=NULL)m_pDocManager-OnFileNew();/接著調(diào)用下面的函數(shù)voidCDocManager:OnFileNew()if(m_templateList.IsEmpty()TRACE(traceAppMsg,0,Error:nodocume

51、nttemplatesregisteredwithCWinApp.n);AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);return;CDocTemplate*pTemplate=(CDocTemplate*)m_templateList.GetHead();if(m_templateList.GetCount()1)/morethanonedocumenttemplatetochoosefrom/bringupdialogpromptinguserCNewTypeDlgdlg(&m_templateList);INT_PTRnID=dlg.DoModa

52、l();if(nID=IDOK)pTemplate=dlg.m_pSelectedTemplate;elsereturn;/none-canceloperationASSERT(pTemplate!=NULL);ASSERT_KINDOF(CDocTemplate,pTemplate);pTemplate-OpenDocumentFile(NULL);/接著調(diào)用下面的函數(shù)/ifreturnsNULL,theuserhasalreadybeenalertedCDocument*CMultiDocTemplate:OpenDocumentFile(LPCTSTRlpszPathName,BOOLb

53、MakeVisible)CDocument*pDocument=CreateNewDocument();/產(chǎn)生模板控制之一:文檔if(pDocument=NULL)TRACE(traceAppMsg,0,CDocTemplate:CreateNewDocumentreturnedNULL.n);AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);returnNULL;ASSERT_VALID(pDocument);BOOLbAutoDelete=pDocument-m_bAutoDelete;pDocument-m_bAutoDelete=FALSE;/dontdestroyifsomethingg

溫馨提示

  • 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

提交評論