TN025:文件、檢視和框架建立
注意
下列技術提示自其納入線上文件以來,未曾更新。 因此,有些程序和主題可能已過期或不正確。 如需最新資訊,建議您在線上文件索引中搜尋相關的主題。
本附註將描述建立 WinApps、DocTemplate、文件、框架和檢視及其擁有權的問題。
WinApp
系統中有一個 CWinApp
物件。
該物件是由架構的內部實作 WinMain
以靜態方式建構並初始化。 您必須衍生自 CWinApp
以執行任何有用的動作(例外狀況:MFC 擴充 DLL 不應該有 CWinApp
實例,而是在 中 DllMain
完成初始化)。
一個 CWinApp
物件會擁有一份文件範本的清單 (CPtrList
)。 每個應用程式會有一個或多個文件範本。 DocTemplate 通常是從 CWinApp::InitInstance
中的資源檔 (也就是字串陣列) 載入。
pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);
AddDocTemplate(pTemplate);
這一個 CWinApp
物件會擁有應用程式中的所有框架視窗。 應用程式的主要框架視窗應該儲存在 CWinApp::m_pMainWnd
中;如果您尚未讓 AppWizard 為您執行,通常會在實作中 InitInstance
設定 m_pMainWnd 。 若是單一文件介面 (SDI),這個 CFrameWnd
就會做為主應用程式框架視窗,也是唯一的文件框架視窗。 若是多重文件介面 (MDI),這會是 MDI 框架 (CMDIFrameWnd
類別),它會做為主應用程式框架視窗並且包含所有子 CFrameWnd
。 每個子視窗都屬於 CMDIChildWnd
類別 (衍生自 CFrameWnd
),並且做為可能有多個文件框架視窗的其中一個。
DocTemplate
CDocTemplate
是文件的建立者與管理者。 它擁有本身所建立的文件。 如果您的應用程式使用下面所述的資源架構方法,就不需要衍生自 CDocTemplate
。
若是 SDI 應用程式,CSingleDocTemplate
類別會追蹤一份開啟的文件。 若是 MDI 應用程式,CMultiDocTemplate
類別會保留一份所有從該範本建立且目前開啟之文件的清單 (CPtrList
)。 CDocTemplate::AddDocument
和 CDocTemplate::RemoveDocument
會提供虛擬成員函式,用來在範本中加入或移除文件。 CDocTemplate
是 的朋友, CDocument
因此我們可以設定受保護的 CDocument::m_pDocTemplate
返回指標,以指向建立檔的檔範本。
CWinApp
會處理預設的 OnFileOpen
實作,接著該實作就會查詢所有文件範本。 實作中包含尋找已開啟的文件,以及決定採用何種格式開啟新文件。
CDocTemplate
會管理文件和框架的 UI 繫結。
CDocTemplate
會保留未命名文件數目的計數。
CDocument
CDocument
由 所 CDocTemplate
擁有。
文件會有一份目前正在檢視文件之已開啟檢視 (衍生自 CView
) 的清單 (CPtrList
)。
文件不會建立/終結檢視,不過它們會在建立之後互相連接。 當文件關閉時 (透過 [檔案]/[關閉]),所有連接的檢視都會關閉。 當文件中的最後一個檢視關閉時 (透過 [視窗]/[關閉]),文件將會關閉。
CDocument::AddView
、RemoveView
介面可用來維護檢視清單。 CDocument
是 的朋友, CView
所以我們可以設定 CView::m_pDocument
後指標。
CFrameWnd
CFrameWnd
(也稱為框架) 的功能與在 MFC 1.0 中相同,不過,CFrameWnd
類別現在設計為可在多種情況下使用,而不需衍生新的類別。 衍生的類別 CMDIFrameWnd
和 CMDIChildWnd
也會經過強化,當中便已實作許多標準命令。
CFrameWnd
負責在框架工作區中建立視窗。 通常框架工作區中會填入一個主視窗。
若是 MDI 框架視窗,工作區中會填入 MDICLIENT 控制項,該控制項會是所有 MDI 子框架視窗的父項。 若是 SDI 框架視窗或 MDI 子框架視窗,工作區中通常會填入 CView
衍生的視窗物件。 若是使用 CSplitterWnd
,檢視的工作區中會填入 CSplitterWnd
視窗物件,而 CView
衍生的視窗物件 (每分割窗格有一個物件) 會建立為 CSplitterWnd
的子視窗。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應