Dim h As Long
Select Case nTag
Case 0:
Me.CreateView TreeView
Case 1:
Me.CreateView GridView
Case 2:
Me.CreateView HtmlView
Case 3:
Me.CreateView FormView
Case 4:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter FormView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 2, 1, 0, h)
Me.CreateViewInSplitter GridView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter HtmlView, 1, 0, 0, 0, 0, h
Case 5:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter FormView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 2, 1, 0, h)
Me.CreateViewInSplitter HtmlView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 0, 0, h
Case 6:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter TreeView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 2, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 0, 0, h
Case 7:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter TreeView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 3, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 2, 0, 0, 0, 0, h
Case 8:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter TreeView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 3, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateViewInSplitter HtmlView, 2, 0, 0, 0, 0, h
Case 9:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter TreeView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 3, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateExcelTabWndInSplitter GridView, "test", 2, 0, 0, 0, h 'MS Excel WorkBook型窗口
Case 10:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter FormView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 3, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateExcelTabWndInSplitter GridView, "test", 2, 0, 0, 0, h
Case 11:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter FormView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 4, 1, 0, h)
Me.CreateViewInSplitter HtmlView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateExcelTabWndInSplitter GridView, "test", 2, 0, 0, 100, h
Me.CreateViewInSplitter GridView, 3, 0, 0, 100, 0, h
Case Else:
h = Me.CreateSplitter("", 1, 2, 0)
Me.CreateViewInSplitter TreeView, 0, 0, 100, 0, 0, h
h = Me.CreateNestedSplitter(0, 1, 3, 1, 0, h)
Me.CreateViewInSplitter FormView, 0, 0, 0, 100, 0, h
Me.CreateViewInSplitter GridView, 1, 0, 0, 100, 0, h
Me.CreateViewInSplitter HtmlView, 2, 0, 0, 0, 0, h
End Select
End Sub
由此,我們僅需要一個文檔模板、一個CFrameWnd類、一個文檔類,而一個具體的文檔究竟有多少個視類取決於文檔的一個特徵參數,每個特徵參數對應一個特定的“描述”(參考上述Select-case結構處理),我的工作表明在VBA的框架內MFC的Document-View體系完全可定製化,即:只要描述好相應的視類,即可產生豐富的、功能強大的文檔。在VisualDeveloper中,我重點刻畫了六個基本的視類:1:ActiveDocument(VBDocument)類CAxDocView;2:CMFCFormView(host MS Form2(請參考Ms office中的UserForm));3:CMfcHtmlView;4:CMfcGridView(Stingray公司的Object Grid Pro 8.0的核心組件);5:CMfcTreeView;6:CMfcListView。其中前面四個類均具有可編輯、可編程功能,我認爲以上六個類通過CSplitterWnd類(可嵌套使用CSplitterWnd,即:CSplitterWnd內創建CSplitterWnd)以及各類風格的TABWnd(如:類似MsExcel中的WorkBook型Tab窗口或其他類似VisualStudio中的TabWnd)足以組合成功能強大、形態豐富的複合文檔,如果需要可以在VisualDeveloper機制中引入其他MFC View類.Mfc的Document-View機制明顯的一個缺欠是:各個視口的交互作用必須通過指針在C++框架內完成,通過集成VBA,我實現了將每個視類映射成VBA可編程項,這樣自然的在VBA框架內解決了視口類之間的交互調用問題,同時每個視類的數據成員、包含的方法等個性化問題全部提交給VB環節。通過集成VBA我們基本解決了用戶界面設計問題(包括定製化對話框,由於VBA提供Form引擎,見Office),使得用戶可以運用簡單的VBA代碼實現MFC風格的用戶界面,同時具備傳統VB的Form編程機制。