資源描述:
《基于單文檔的(mfc)窗口分割》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、基于單文檔的窗口分割簡介部分是對于MFC應用程序的介紹,在博客上看到的,覺得受益匪淺,所以寫到這里。不需要的朋友可以從第二部分程序設計開始看起。12目錄基于單文檔的窗口分割1簡介2MFC應用程序類型簡介2單文檔與多視圖4單文檔多視圖程序設計5Step1:創(chuàng)建單文檔的MFC程序5Step2:聲明相關的變量。5Step3:重載OnCreateClient()函數(shù),進行窗口的分割6Step4:設置行列初始值8附:代碼912簡介MFC應用程序類型簡介在MicrosoftVC++6.0中,基于MFC的應用程序一般分為以下幾種:多文檔界面(MDI)單文檔界面(SDI)基于對話框的應用程序
2、。圖1-1應用程序類型其中單文檔又可分為單視圖的和多視圖的。12圖1-2單文檔單視圖圖1-3單文檔多視圖一般情況下,單文檔僅需要單視圖就夠了,如Windows自帶的記事本、畫圖程序等等,但12在一些情況下,單文檔需要多視圖支持,比如同時觀察文檔的不同部分,同時從不同的角度觀察同一文檔等。?在MFC的框架下,文檔對象(CDocument)有一個保存其所有視圖的列表,并提供了增加視圖(AddView)與刪除視圖(RemoveView)函數(shù),以及當文檔內(nèi)容改變時通知其所有視圖的方法(UpdateAllViews)。1-4類視圖通過多文檔框架的窗口復制機制和單文檔框架的分割窗口機制是
3、實現(xiàn)單文檔多視圖的主要方法。單文檔與多視圖?一般地,單文檔與多視圖有三種情況:1)在多文檔界面MDI中,每個視圖位于MDI的一個獨立子文檔框架中,視圖對象基于同一個視圖類。用戶可以通過“窗口
4、新窗口”菜單,為同一文檔的視圖再創(chuàng)建一個窗口,通過新創(chuàng)建的窗口,可以編輯和觀察文檔的另一部分,同一文檔各個視圖之間自動實現(xiàn)同步,用戶修改一個視圖的內(nèi)容,在另外的視圖中也自動更新。MFC框架通過復制原來的子框架窗口和其中的視圖來實現(xiàn)上面的功能,并且是完全自動的。2)視圖對象基于同一視圖類,所有視圖位于同一文檔框架中。?分割窗口將單文檔窗口的視圖區(qū)分割成幾個獨立的視圖,框架從同一視圖類創(chuàng)建多
5、個視圖對象。Word的子窗口即屬于這種類型。3)視圖對象基于不同的視圖類,所有的視圖位于同一文檔框架中。?多個視圖共享同一文檔框架,但從不同的視圖類創(chuàng)建,每個視圖可以為文檔提供不同的觀察和編輯方法。比如在一個窗口里觀察文檔的不同部分,或者是在一個窗口里用不用類型的視圖觀察同一個文檔。這種類型的實現(xiàn)方法是通過重載框架類CMainFrame的成員函數(shù)OnCreateClient實現(xiàn),用戶可以根據(jù)不同需要將窗口分為垂直或水平的多個分割窗口。12單文檔多視圖程序設計?下面通過實例設計,介紹單文檔多視圖的窗口分割(上面介紹的第二種情況)。Step1:創(chuàng)建單文檔的MFC程序創(chuàng)建一個基于M
6、FC的應用程序,程序類型選擇“單文檔”,命名為“SplitterTest”。Step2:聲明相關的變量。在MainFrm.h中添加如下變量聲明。public:CSplitterWndm_miansplitter;CSplitterWndm_leftSplitter;CSplitterWndm_rightSplitter;CSplitterWndm_leftbottom;BOOLm_isSplitter;并在CMainFrame的構(gòu)造函數(shù)中,初始化isSplitter為FALSE12Step3:重載OnCreateClient()函數(shù),進行窗口的分割圖2-1重載OnCreate
7、Client()函數(shù)在OnCreateClient()函數(shù)中添加如下代碼:12這時,運行程序,會發(fā)現(xiàn)窗口已經(jīng)被分割為多視圖。但是,需要拖動一下才顯示出來。12圖2-2初步運行結(jié)果Step4:設置行列初始值重載OnSize函數(shù)。圖2-3重載OnSize函數(shù)在函數(shù)中添加如下代碼,此時,運行結(jié)果正常。12圖2-4最終運行結(jié)果附:代碼BOOLCMainFrame::OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext){//TODO:在此添加專用代碼和/或調(diào)用基類//窗口的分割if(m_mainsplitter.Creat
8、eStatic(this,1,2)==FALSE){returnFALSE;}if(m_leftsplitter.CreateStatic(&m_mainsplitter,2,1,WS_CHILD
9、WS_VISIBLE,m_mainsplitter.IdFromRowCol(0,0))==FALSE){returnFALSE;}if(m_rightsplitter.CreateStatic(&m_mainsplitter,1,2,WS_CHILD
10、WS_VISIBLE,m_mainsplitter.Id