AppWizard 產生的 SDI 專案預設僅支援單一「文檔/視圖」模板。若需在同一專案中提供不同視圖類型 (如 CScrollView 與分割器視圖) 供使用者選擇,需手動建立多個 CSingleDocTemplate。本文詳細步驟示範如何實現雙模板 SDI 應用程式。
CScrollView 衍生。CT2App, CMainFrame, CT2Doc, CT2View。F2 衍生自 CFrameWnd。V 衍生自 CEditView。M2。M2, Value=M2 值, Caption="TEMPLATE2"。CT2App::InitInstance 註冊第二個文檔模板#include "F2.h"
#include "V.h"
BOOL CT2App::InitInstance()
{
// ... 原有初始化碼 ...
// 原有第一個模板
CSingleDocTemplate* pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CT2Doc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CT2View));
AddDocTemplate(pDocTemplate);
// 新增第二個模板
pDocTemplate = new CSingleDocTemplate(
M2, // 選單/字串資源 ID
RUNTIME_CLASS(CT2Doc), // 共用文檔類別
RUNTIME_CLASS(F2), // 不同框架類別
RUNTIME_CLASS(V)); // 不同視圖類別
AddDocTemplate(pDocTemplate);
// ... 其餘碼 ...
}
F2 框架類別的分割器視圖F2.h 新增成員:
private:
CSplitterWnd m_splitter;
F2.cpp 覆寫 OnCreateClient:
BOOL F2::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CRect rc; GetClientRect(&rc);
m_splitter.CreateStatic(this, 2, 1); // 兩行一列
// 上半部:使用文檔模板指定的視圖類別 (V)
m_splitter.CreateView(0, 0, pContext->m_pNewViewClass,
CSize(rc.Width(), rc.Height()/2), pContext);
// 下半部:固定使用 CEditView 衍生類 V
m_splitter.CreateView(1, 0, RUNTIME_CLASS(V),
CSize(0,0), pContext);
SetActiveView((CView*)m_splitter.GetPane(0,0));
return TRUE;
}
CT2View (滾動視圖)。F2 框架內嵌分割器,上半部為文檔視圖,下半部為編輯視圖。MDI 專案同樣適用,差異在於:
CMDIChildWnd。在 CT2View::OnInitialUpdate 中設定捲軸範圍:
CSize sizeTotal(800, 800); // 大於視窗尺寸
SetScrollSizes(MM_TEXT, sizeTotal);
多文檔模板讓單一 SDI/MDI 專案支援多種視圖呈現方式,滿足不同使用情境。關鍵在於正確建立 CSingleDocTemplate/CMultiDocTemplate 並關聯對應的框架、文檔、視圖類別與資源 ID。