資源描述:
《在view類中創(chuàng)建分割多視》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、本文在介紹了幾種標準的單文檔與多視結構的VC5.0MFC實現(xiàn)方法之后,介紹了筆者摸索出的另外兩種實用方法,并給出了實現(xiàn)它們的的主要程序框架。一、單文檔與多視Windows程序一般分為以下幾種風格:多文檔、單文檔、基于對話框的。Word一類多文檔程序和計算器一類基于對話框的程序不在本文介紹之列。單文檔又分為單視的和多視的。一般情況下,單文檔僅需要單視就夠了,如畫筆等。但也有一些情況下,單文檔需要多視支持,比如同時觀察文檔的不同部分,同時從不同的角度觀察同一文檔等。在MFC的框架下,文檔對象(CDocument)
2、維持了一個保存其所有視的列表,并提供了增加與刪除視的函數(shù),以及當文檔內容改變時通知其所有視的方法。通過多文檔框架的窗口復制機制和單文檔框架的分割窗口機制是實現(xiàn)單文檔多視的主要方法。但這些標準方法在有的情況下并不夠用,為此筆者摸索出另外兩種實用的方法,在實踐中使用效果良好。二、三種標準的單文檔與多視情況1.視對象基于同一視類,每個視位于MDI的一個獨立子文檔框架中。用戶可以通過“窗口新窗口”菜單,為同一文檔的視再創(chuàng)建一個窗口,通過新創(chuàng)建的窗口,可以編輯和觀察文檔的另一部分,同一文檔各個視圖之間自動實現(xiàn)同步,用
3、戶修改一個視的內容,在另外的視中也自動更新。MFC框架通過復制原來的子框架窗口和其中的視來實現(xiàn)上面的功能,并且是完全自動的。2.視對象基于同一視類,所有視位于同一文檔框架中。分割窗口將單文檔窗口的視區(qū)分割成幾個獨立的視,框架從同一視類創(chuàng)建多個視對象。Word的子窗口即屬于這種類型。3.視對象基于不同的視類,所有的視位于同一文檔框架中。多個視共享同一文檔框架,但從不同的視類創(chuàng)建,每個視可以為文檔提供不同的觀察和編輯方法。比如一個視用圖形觀察文檔,而另一個視用文本編輯文檔中對象的屬性。這種情況也適應于用不同的視來
4、觀察文檔的不同部分。這種類型的實現(xiàn)方法是通過重載OnCreateClient函數(shù)實現(xiàn)。下面的例子實現(xiàn)了圖中的分割窗口。BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT,CCreateContext*pContext){RECTrect;//先分割為1X2的形式m_wndSplitter1.CreateStatic(this,1,2,WS_CHILD
5、WS_VISIBLE);m_wndSplitter1.SetColumnInfo(0,300,0);//設置第一列的寬度
6、//將第一列進一步分割為2X1的形式m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD
7、WS_VISIBLE,m_wndSplitter1.IdFromRowCol(0,0));//創(chuàng)建各個視m_wndSplitter1.CreateView(0,1,RUNTIME_CLASS(CviewView1),CSize(0,0),pContext);m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CviewView
8、2),CSize(0,0),pContext);m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CviewView3),CSize(0,0),pContext);......}在實踐中,筆者發(fā)現(xiàn)這三種方式有時都不適用。比如以下的兩種情況:需要在不同的時間分別觀察同一文檔的不同部分,而文檔分割成不同部分的數(shù)量較多,這樣就不宜用分割窗口來實現(xiàn),而需要在同一框架中切換不同的視;另一種情況可以說是上面提到的第三種情況和此處第一種情況的組合,即在單文檔框架中包含有多個由分割窗口分
9、割的區(qū)域,而某(或某些)分割區(qū)域中包含有多個不同的視,僅有其中的一個視顯示出來。與第三種情況類似,其它分割區(qū)域中具有不同的視,但它們同時顯示出來。因為在實現(xiàn)方法上有所不同,所以這里分為兩種情況來討論,這也是這篇文章要介紹的重點。三、單文檔單框架窗口中的多視下面的例子演示了第一種情況下,具有兩個視的簡單實現(xiàn)方法。必需考慮如下的問題:非活動的視是否繼續(xù)連接到文檔。當視連接到文檔時,它從文檔接收OnUpdate通知消息,使其保持與文檔內容同步。但這樣做將增加計算機的開銷,同時也會增加程序開發(fā)的任務。另一方法是當非活
10、動的視重新變成活動時,再進行與文檔的同步工作。例子中采用后一種方法。BOOLCMainFrame::OnViewChange(UINTnCmdID){CView*pViewAdd;CView*pViewRemove;CDocument*pDoc=GetActiveDocument();UINTnCmdID;nCmdID=LOWORD(GetCurrentMessage()->wParam);if((