視窗的分裂類型主要有兩種:動態(tài)分裂和靜態(tài)分裂。動態(tài)分裂可以讓使用者通過拖曳分裂方塊的使用,將視窗分裂。動態(tài)分裂最多只可以將視窗分裂為2×2個子視窗,不能進行混合分裂視窗,所有子視窗的屬性和父視窗都是一樣的,而且子視窗的數(shù)據(jù)通常來源于同一處。
靜態(tài)分裂是指使用者除了可以調(diào)整子視窗的大小和進行混合分裂視窗外,最多可將視窗分裂為16×16個子視窗,每個子視窗可以有不同的視圖類(CView),各個子視窗顯示的數(shù)據(jù)可以來自于不同的數(shù)據(jù)源。不論是要創(chuàng)建動態(tài)分裂視窗還是靜態(tài)分裂視窗,都必須要利用MFC的CSplitterWnd類別來完成視窗的分裂。
混合靜態(tài)分裂視窗的實現(xiàn)
混合分裂視窗是指在子視窗中進行視窗的再分裂。在MFC的框架下,混合分裂視窗必須完成三件工作:
(1)在視窗框架類別中定義CSplitterWnd控件為其屬性(數(shù)據(jù)成員)。
(2)重載視窗框架類別中的OnCreateClient函數(shù)(CFrameWnd::OnCreateClient),建立靜態(tài)分裂子視窗,為靜態(tài)分裂子視窗填充視圖。
(3)建立維持各子視窗同步更新的機制。
首先,利用MFC AppWizard生成一個單文檔應(yīng)用程序,在應(yīng)用程序的CMainFrame類別中聲明CSplitterWnd類別的數(shù)據(jù)成員。
其次,重載CMainFrame類別中的OnCreateClient(LPCREATESTRUCT,CCreateContext* pContext)函數(shù)。在該函數(shù)中利用CsplitterWnd類別的構(gòu)造函數(shù)Create Static(CWnd *pParentWnd,int nRows,int nCols,DWORD dwstyle,UINT nID) 創(chuàng)建混合靜態(tài)分裂子視窗,即在Create Static分裂出的子視窗中利用CsplitterWnd類別的控件再一次分裂視窗。
Create Static函數(shù)的參數(shù)含義為:
·pParentWnd是準備建立靜態(tài)分裂視窗的視窗框架控件的指針;
·nRows和nCols是準備建立靜態(tài)分裂視窗行數(shù)(nRows)與列數(shù)(nCols)
因此,創(chuàng)建的靜態(tài)分裂子視窗個數(shù)為nRows × nCols個,這兩個參數(shù)最小不得小于0,最大不可超過16;dwstyle是設(shè)定子視窗的形式;nID靜態(tài)分裂的代號(ID),此代號預設(shè)為AFX_IDW_PANE_FIRST,若靜態(tài)分裂視窗位于另一個分裂視窗內(nèi)時,不可以使用默認值,可以利用CsplitterWnd類別的成員函數(shù)IdFromRowCol(int row,int col)獲得。利用CsplitterWnd類別的成員函數(shù)Create View (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext) 為靜態(tài)分裂子視窗填充視圖,在將視圖與子視窗關(guān)聯(lián)時必須先完成子視窗的創(chuàng)建。
Create View函數(shù)的參數(shù)含義為:
·row和col是指定準備建立View控件的子視窗,其指定的方式是以表示該子視窗所在的行列位置;
·pViewClass是指定用于建立子視窗View控件的View類別,該類別需要被聲明為Run-Time類別;
·Sizeini是View控件的起始大?。籶Context是一個指向記錄應(yīng)用程序所使用的視窗框架控件、Document控件,以及View控件之變量的指針,此參數(shù)在CMainFrame::OnCreateClient函數(shù)被調(diào)用時傳入,再由該函數(shù)傳遞給此函數(shù)。
·CsplitterWnd類別的成員函數(shù)SetColumnInfo(int col,int cxIdeal,int cxMin)和SetRowInfo(int row,int cyIdeal,cyMin)為設(shè)置子視窗的寬度和高度,參數(shù)cxIdeal和cxMin是指定子視窗的寬度和最小寬度,cyIdeal和cyMin是指定子視窗的高度和最小高度,在使用這兩個函數(shù)調(diào)整子視窗的大小后還應(yīng)該使用該類別的成員函數(shù)RecalLayout()重新調(diào)整視窗框架的布局。如果要設(shè)定視窗框架里的活動子視窗,可以通過CsplitterWnd類別的成員函數(shù)SetActivePane(int row,int col,CWnd* pWnd=NULL)來完成,該函數(shù)指定子視窗的方式有兩種,一是指出子視窗所在的行列,二是傳入指向該子視窗的控件指針。
最后,將視窗分裂成多個子視窗后,整個視窗程序中將存在多個View控件。當在其中一個View控件執(zhí)行更新操作時,如何讓其它View控件同步更新數(shù)據(jù)?可以通過文檔類別(CDocument)的UpdateAllViews(CView* pSender,LPARAM lHint,CObject* pHint)成員函數(shù)的調(diào)用,再由該函數(shù)分別調(diào)用目前存在于視窗程序中各View控件的On Update函數(shù)來完成數(shù)據(jù)的同步更新。
UpdateAllViews函數(shù)的參數(shù)含義為:
·pSender是指向引發(fā)更新操作的View控件指針,如果傳入NULL表示所有視圖都要執(zhí)行更新操作;
·lHint是用于傳送更新視圖時,需要傳送的額外信息參數(shù);
·pHint是指向記錄更新視圖所需額外信息的控件。在調(diào)用該函數(shù)時,將View控件的指針傳入的目的是要告訴該函數(shù)該子視圖已經(jīng)完成數(shù)據(jù)更新,該函數(shù)不需要再調(diào)用該子視圖的On Update進行數(shù)據(jù)更新。
新聞熱點
疑難解答