




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銷售代理合同模板(樣式一)
- 教育實習(xí)單位與實習(xí)生合同樣本
- 5《江上漁者》教學(xué)設(shè)計-2023-2024學(xué)年六年級下冊語文統(tǒng)編版
- 拆除與廢棄物處理合同
- 臨床試驗數(shù)據(jù)分析合同
- 2024秋閩教版信息技術(shù)五年級上冊《第5課 插入圖片秀美景》教學(xué)設(shè)計
- 外商投資企業(yè)員工股權(quán)激勵合同
- 銷售合同萬能模板
- 新版車輛抵押合同范本
- 11 對人有禮貌 教學(xué)設(shè)計-2024-2025學(xué)年道德與法治一年級上冊統(tǒng)編版
- 班會課件:逆風(fēng)飛翔破繭成蝶-從《哪吒之魔童鬧?!房辞啻浩诘某砷L與責(zé)任
- 2.1 堅持依憲治國 教案 -2024-2025學(xué)年統(tǒng)編版道德與法治八年級下冊
- 【語文試卷+答案】2024-2025學(xué)年泉州高二上期末質(zhì)檢
- 《修繕定額講解》課件
- 大學(xué)學(xué)生宿舍管理員工作培訓(xùn)
- 初三物理常識試卷單選題100道及答案
- 浙江2024公務(wù)員考試真題及答案
- 初中新課標(biāo)培訓(xùn)課件
- 公司銀行貸款申請書范文
- 高中英語新課程標(biāo)準(zhǔn)解讀課件
- 1.2《友邦驚詫論》教學(xué)設(shè)計-【中職專用】高二語文同步講堂(高教版2024·拓展模塊上冊)
評論
0/150
提交評論