基于单文档的MFC窗口分割_第1页
基于单文档的MFC窗口分割_第2页
基于单文档的MFC窗口分割_第3页
基于单文档的MFC窗口分割_第4页
基于单文档的MFC窗口分割_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于单文档的窗口分割简介部分是对于MFC应用程序的介绍,在博客上看到的,觉得受益匪浅,所以写到这里。不需要的朋友可以从第二部分程序设计开始看起。目录基于单文档的窗口分割1简介3MFC应用程序类型简介3单文档与多视图5单文档多视图程序设计6Stepl:创建单文档的MFC程序6Step2:声明相关的变量。6Step3:重载OnCreateClient()函数,进行窗口的分割7Step4:设置行列初始值9附:代码10简介MFC应用程序类型简介在MicrosoftVC+6.0中,基于MFC的应用程序一般分为以下几种:多文档界面(MDI)单文档界面(SDI)基于对话框的应用程序。图1-1应用程序类型其中

2、单文档又可分为单视图的和多视图的。品三冷:;了-/1/1士工工学工4"写£H件如阑病视图坦)帮助尤匚nuF.缗号©区以造图1-3单文档多视图般情况下,单文档仅需要单视图就够了,如Windows自带的记事本、画图程序等等,但图1-2单文档单视图在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度观察同一文档等。在MFC的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了增加视图(AddView)与删除视图(RemoveView)函数,以及当文档内容改变时通知其所有视图的方法(UpdateAllViews)。类视困V

3、又宏和京量V全局函数和变星±j也CAboutDL宣tl比JCWairiFramei£lCSpli11arTtstAppS触ft1硬殖时也CSplitier!estlfiew.±Kplitt如T式(vsd)7AidVi5CVie»tpITikksetlidCvi"Donst/iVtJidCv«id)comI*BeginVTa.i1Corsdr(vsid)."COINanb留Fuji,(3nst,AJX.GCuCIn丁(CFt网物nQ:1-4类视图通过多文档框架的窗口复制机制和单文档框架的分割窗口机制是实现单文档多视图的主要方法

4、。单文档与多视图一般地,单文档与多视图有三种情况:1)在多文档界面MDI中,每个视图位于MDI的一个独立子文档框架中,视图对象基于同一个视图类。用户可以通过窗口|新窗口”菜单,为同一文档的视图再创建一个窗口,通过新创建的窗口,可以编辑和观察文档的另一部分,同一文档各个视图之间自动实现同步,用户修改一个视图的内容,在另外的视图中也自动更新。MFC框架通过复制原来的子框架窗口和其中的视图来实现上面的功能,并且是完全自动的。2)视图对象基于同一视图类,所有视图位于同一文档框架中。分割窗口将单文档窗口的视图区分割成几个独立的视图,框架从同一视图类创建多个视图对象。Word的子窗口即属于这种类型。3)视

5、图对象基于不同的视图类,所有的视图位于同一文档框架中。多个视图共享同一文档框架,但从不同的视图类创建,每个视图可以为文档提供不同的观察和编辑方法。比如在一个窗口里观察文档的不同部分,或者是在一个窗口里用不用类型的视图观察同一个文档。这种类型的实现方法是通过重载框架类CMainFrame的成员函数OnCreateClient实现,用户可以根据不同需要将窗口分为垂直或水平的多个分割窗口。单文档多视图程序设计下面通过实例设计,介绍单文档多视图的窗口分割(上面介绍的第二种情况)Stepl:创建单文档的MFC程序创建一个基于MFC的应用程序,程序类型选择“单文档”,命名为“SplitterTest”。S

6、tep2:声明相关的变量在MainFrm.hpublic:CSplitterWndCSplitterWndCSplitterWndCSplitterWnd中添加如下变量声明。m_miansplitter;m_leftSplitter;m_rightSplitter;m_leftbottom;BOOLmisSplitter;3458T89C1111111122“厘性public:CSpliUtrWCSplitt4pWnlCSpliUtrWnlCSpliatrWnlBOOLm_miinspl11.七电T;m_jrihtsplittsr:OSpli11”.指示窗口是否已维迸行了分割并在CMainFr

7、ame的构造函数中,初始化isSplitter为FALSE3=HCflainFranie构造/析构4- .-:1CFALSEJ;|'/TODO:在此添加成员初始化代码1133BDfltLCMainframe:OnCreateClient(LPCKEATESTRUCTIpcm,CCreateCcmtext>pCortteirt)L14d111明116;117。L的119:12D:121|122123.12411ZS:12612T!1%129'130H131132:1.33:134.135:1前13TStep3:重载OnCreateClient()函数,进行窗口的分割Clai

8、nFrmeYCCodeClasz:il垣孑讨g«t_accValu*GttActicum白a七EtActiveFranteGftinterf4c*Hook的土M电1号亳目电5iring昼tScrollBarCtriKtnJHelFIslnvokeAllowedLoadFraneQnAffibiertFropartyOrJChilNotifyOrdCcmHandClnCreitAcerelates=-zl、IJnCi'e-LtClintOnfreatedientQrJinkLRfil白uTOnNcti£y图2-1重载OnCreateClient()函数在OnCreat

9、eClient()函数中添加如下代码:/TOK:由1麻加专用代码加,或调用基类疗窗口的分割ifGh_ntiniplitt*r.CrftteStttie(this,1,)=-FALSE)1rtturnFALSE;if(m_le£tsplitter.CreateSutic(fiim_mainzplitter,2f1,WS_CKILCIlSjnsiBLE,m_mainspli11er.IdFroibEckCol(0,O”=FAtSE)(r&turnFALSE:)ifGrj-ightsplittar.CreittStitciniplitter,1,2,WS_CHILD|VISIBLE

10、,mmainplitierIdPrQmiEowCQl1)=FALSE)returnFALSE;)i£G«_le£tbottom.CreateStatic(fcn_J.e£tsplitter,1,2,WS_C)nLD|ltfS_VISI£LEJm_la£tspLitter.IdFronkEowCftl1,0)士士FALSEJrtturnFALSE:1m_isSplitttr-TRUE;13至HO;Bl;142iU3=l同1mU7|H«=HOF15叫isd152i153E15堵155=1SG:157150;1码160:lei!i

11、"163=164=165!I畸ItTilesllty=J7蝴定视图CHe.:i«Raet;tClienlRectlaeEect);ifbjeftalitterCr电虱砰i个MQRlfflT:NE_CUSSOjliLrI«tVi«lCSizetcR«tVidtlO/2.cRectH式的t/?LrJUL>I)rIrwtarRTJH5E;1litn_riztt£3ilittijCreateVisw(U.U,IUN71ME_LLASSIfSplltterl*st¥iw),CSiz<cA*clVidt±i0/4.

12、cl*ct.H*i£ht)£fCuntkGuTHiJE)fretijriiFALSE.ifa_riditspliti«rCrtit1,MJjriME_CU55(CSplittwitsCSizt(cl«tWidthORcE«vH*itfiUDXContcmt)=F+L£TI)rrci>jrnFALSE,:f5iflbvltmEmtt«Yi,电OJWnMZCLASS®5plilUiTtitVis),C重工SRrJ悔1th。/4eB*ct.KtigfU0/2).Can4altI)=FM-SI)lrILrtt'

13、;lHi.TALSI;ifQi_lafibvttwi.CrcttcVigfiQJ.HU1OM3_CLASS(CSplitt“Tv,tVi(w).CSin(cK«gkcfkcl.Hti次t0/乃.他口川ewtFfiLSE1rtt<vnTAI3T;TitJTT.rEUE这时,运行程序,会发现窗口已经被分割为多视图。但是,需要拖动一下才显示出来。图2-2初步运行结果Step4:设置行列初始值重载OnSize函数。CBainFrVCCadeCl/:41匿多司。JI州_QUERTDRJWIlffM_QUERYEKDSI:附_QUERT蛇WF式VLQUERWFEIIffM_QUERTUIS

14、TA州IBITTTO刖阳_EE再TQ刖旧;TMRBlITTOHUfffNI.REMDERAUJiffM_RENDEEFDRJJ.卷SETCUESOR州_BETFOCUSffi_SEniN(3CIUM.SHamwDOtfM_SIZEOnfiiia_SIZECITFEC.图2-3重载OnSize函数在函数中添加如下代码,167166317u171MN173174ITS176i176'ITE;UvoidCM&iiiFtaftognSih巨CUIHTiJ建电,mt国latcyj/71010;在此处添加消息处理程序代码CfiectexFtan;G*tCli9n.

15、tEect(ftffrFran);ifCFrAjntd:OnSi.工电MT1yatjcy)m_mainEplitteT.SetCalumnIiifo00,crTram.WilthO/2,10);mj-eftsplitter.£RereInfo©crFram.Height10);mi_riglktsplLtier.SfttColumiilnfo(,crFrajn-Wid+hO/4.10):m_riglitsplitter.SetColumnlnfci(1/crFraju.WidthO/4.10j;m_m:a_iusp1itiLez".R.ecalclayotlItQ

16、j此时,运行结果正常。图2-4最终运行结果附:代码BOOLCMainFrame:OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)(/TODO:在此添加专用代码和/或调用基类/窗口的分割if(m_mainsplitter.CreateStatic(this,1,2)=FALSE)(returnFALSE;if(m_leftsplitter.CreateStatic(&m_mainsplitter,2,1,WS_CHILD|WS_VISIBLE,m_mainsplitter.IdFromRowCol(0,0)=FALSE)

17、(returnFALSE;if(m_rightsplitter.CreateStatic(&m_mainsplitter,1,2,WS_CHILD|WS_VISIBLE,m_mainsplitter.IdFromRowCol(0,1)=FALSE)(一returnFALSE;)if(m_leftbottom.CreateStatic(&m_leftsplitter,1,2,WS_CHILD|WS_VISIBLE,m_leftsplitter.IdFromRowCol(1,0)=FALSE)一returnFALSE;)m_isSplitter=TRUE;/绑定视图CRectcRe

18、ct;GetClientRect(&cRect);if(m_leftsplitter.CreateView(0,0,RUNTIME_CLASS(CSplitterTestView),CSize(cRect.Width()/2,cRect.Height()/2),pContext)=FALSE)returnFALSE;)if(m_rightsplitter.CreateView(0,0,RUNTIME_CLASS(CSplitterTestView),CSize(cRect.Width()/4,cRect.Height(),pContext)=FALSE)returnFALSE;)if(m_rightsplitter.CreateView(0,1,RUNTIME_CLASS(CSplitterTestView),CSize(cRect.Width()/4,cRect.Height(),pContext)=FALSE)returnFALSE;)if(m_leftbottom.CreateView(0,0,RUNTIME_CLASS(CSplitterTestView),CSize(cRect.Width()/4,cRec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论