CDocument
類別
提供使用者定義的文件類別的基本功能。
語法
class CDocument : public CCmdTarget
成員
公用建構函式
名稱 | 描述 |
---|---|
CDocument::CDocument |
建構 CDocument 物件。 |
公用方法
受保護的方法
名稱 | 描述 |
---|---|
CDocument::OnFileSendMail |
傳送附加檔的郵件訊息。 |
CDocument::OnUpdateFileSendMail |
如果郵件支援存在,請啟用 [傳送郵件] 命令。 |
公用資料成員
名稱 | 描述 |
---|---|
CDocument::m_bGetThumbnailMode |
指定 CDocument 物件是由 dllhost 為縮圖所建立。 應該簽入 CView::OnDraw 。 |
CDocument::m_bPreviewHandlerMode |
指定 CDocument 物件是由 prevhost 建立的 Rich Preview 。 應該簽入 CView::OnDraw 。 |
CDocument::m_bSearchMode |
指定 CDocument 物件是由索引器或其他搜尋應用程式所建立。 |
CDocument::m_clrRichPreviewBackColor |
指定 Rich Preview 視窗的背景色彩。 此色彩是由主機所設定。 |
CDocument::m_clrRichPreviewTextColor |
指定 Rich Preview 視窗的前景色彩。 此色彩是由主機所設定。 |
CDocument::m_lfRichPreviewFont |
指定 Rtf Preview 視窗的文字字型。 此字型資訊是由主機所設定。 |
備註
檔代表使用者通常會使用 [檔案開啟] 命令開啟的數據單位,並使用 [檔案儲存] 命令儲存。
CDocument
支援標準作業,例如建立檔、載入檔,以及儲存檔。 架構會使用 所 CDocument
定義的介面來管理檔。
應用程式可以支援一種以上的檔案類型;例如,應用程式可能同時支援電子錶格和文字檔。 每種類型的檔都有相關聯的檔範本;檔範本會指定用於該檔案類型的資源(例如功能表、圖示或快捷鍵表格)。 每個檔都包含其相關聯 CDocTemplate
物件的指標。
使用者透過 CView
與其相關聯的對象與文件互動。 檢視會在框架視窗中轉譯檔的影像,並將使用者輸入解譯為檔上的作業。 檔可以有多個相關聯的檢視。 當使用者在文件上開啟視窗時,架構會建立檢視並將它附加至檔。 檔範本會指定使用何種類型的檢視和框架視窗來顯示每種類型的檔。
檔是架構標準命令路由的一部分,因此會從標準使用者介面元件接收命令(例如 [檔案儲存] 功能表項)。 檔會接收使用中檢視轉送的命令。 如果文件未處理指定的命令,它會將命令轉送至管理它的檔範本。
修改文件的數據時,每個檢視都必須反映這些修改。 CDocument
UpdateAllViews
提供成員函式,讓您通知檢視這類變更,因此檢視可以視需要重新重繪。 架構也會提示使用者先儲存修改過的檔案,再關閉它。
若要在一般應用程式中實作檔,您必須執行下列動作:
從衍生每個檔案類型的類別
CDocument
。新增成員變數以儲存每個文件的數據。
實作成員函式來讀取和修改文件的數據。 檔的檢視是這些成員函式中最重要的使用者。
CObject::Serialize
覆寫文件類別中的成員函式,以在磁碟中寫入和讀取文件的數據。
CDocument
如果郵件支援 (MAPI) 存在,支援透過郵件傳送您的檔案。 請參閱 MFC 中的 MAPI 和 MAPI 支援文章。
如需 的詳細資訊 CDocument
,請參閱 串行化、 檔/檢視架構主題和 檔/檢視建立。
繼承階層架構
CDocument
需求
標頭: afxwin.h
CDocument::AddView
呼叫此函式,將檢視附加至檔。
void AddView(CView* pView);
參數
pView
指向要加入的檢視。
備註
此函式會將指定的檢視加入至與文件相關聯的檢視清單;函式也會設定檢視的文件指標至此檔。 架構會在將新建立的檢視物件附加至檔時呼叫此函式;這會在回應 [檔案新增]、[檔案開啟] 或 [新增視窗] 命令,或分割器視窗分割時發生。
只有在您手動建立和附加檢視時,才呼叫此函式。 一般而言,您會讓架構藉由定義 CDocTemplate
物件來建立檔案類別、檢視類別和框架視窗類別的關聯,來連接檔和檢視。
範例
// The following example toggles two views in an SDI (single document
// interface) frame window. A design decision must be made as to
// whether to leave the inactive view connected to the document,
// such that the inactive view continues to receive OnUpdate
// notifications from the document. It is usually desirable to
// keep the inactive view continuously in sync with the document, even
// though it is inactive. However, doing so incurs a performance cost,
// as well as the programming cost of implementing OnUpdate hints.
// It may be less expensive, in terms of performance and/or programming,
// to re-sync the inactive view with the document only with it is
// reactivated. This example illustrates this latter approach, by
// reconnecting the newly active view and disconnecting the newly
// inactive view, via calls to CDocument::AddView and RemoveView.
void CMainFrame::OnViewChange(UINT nCmdID)
// There is an ON_COMMAND_RANGE message map entry associated with
// OnViewChange:
// ON_COMMAND_RANGE(ID_VIEW_CHANGE1, ID_VIEW_CHANGE2, &OnViewChange)
{
CView *pViewAdd;
CView *pViewRemove;
CDocument *pDoc = GetActiveDocument();
// cvView1 and cvView2 are enum members defined in my CMainFrame class
if ((nCmdID == ID_VIEW_CHANGE1) && (m_currentView == cvView1))
return;
if ((nCmdID == ID_VIEW_CHANGE2) && (m_currentView == cvView2))
return;
if (nCmdID == ID_VIEW_CHANGE2)
{
if (m_pView2 == NULL)
{
m_pView1 = GetActiveView();
m_pView2 = new CMyView2;
//Note that if OnSize has been overridden in CMyView2
//and GetDocument() is used in this override it can
//cause assertions and, if the assertions are ignored,
//cause access violation.
m_pView2->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rectDefault, this,
AFX_IDW_PANE_FIRST + 1, NULL);
}
pViewAdd = m_pView2;
pViewRemove = m_pView1;
m_currentView = cvView2;
}
else
{
pViewAdd = m_pView1;
pViewRemove = m_pView2;
m_currentView = cvView1;
}
// Set the child i.d. of the active view to AFX_IDW_PANE_FIRST,
// so that CFrameWnd::RecalcLayout will allocate to this
// "first pane" that portion of the frame window's client area
// not allocated to control bars. Set the child i.d. of the
// other view to anything other than AFX_IDW_PANE_FIRST; this
// examples switches the child id's of the two views.
int nSwitchChildID = pViewAdd->GetDlgCtrlID();
pViewAdd->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
pViewRemove->SetDlgCtrlID(nSwitchChildID);
// Show the newly active view and hide the inactive view.
pViewAdd->ShowWindow(SW_SHOW);
pViewRemove->ShowWindow(SW_HIDE);
// Connect the newly active view to the document, and
// disconnect the inactive view.
pDoc->AddView(pViewAdd);
pDoc->RemoveView(pViewRemove);
SetActiveView(pViewAdd);
RecalcLayout();
}
CDocument::BeginReadChunks
初始化區塊讀取。
virtual void BeginReadChunks ();
備註
CDocument::CanCloseFrame
在顯示檔的框架視窗關閉之前,由架構呼叫。
virtual BOOL CanCloseFrame(CFrameWnd* pFrame);
參數
pFrame
指向附加至檔之檢視的框架視窗。
傳回值
如果關閉框架視窗是安全的,則為非零;否則為 0。
備註
默認實作會檢查是否有其他框架窗口顯示檔。 如果指定的框架視窗是最後一個顯示檔,函式會在修改檔時提示使用者儲存檔。 如果您想要在框架視窗關閉時執行特殊處理,請覆寫此函式。 這是可覆寫的進階。
CDocument::CDocument
建構 CDocument
物件。
CDocument();
備註
架構會為您處理檔建立。 OnNewDocument
覆寫成員函式以在每個檔案的基礎上執行初始化;這在單一檔介面 (SDI) 應用程式中特別重要。
CDocument::ClearChunkList
清除區塊清單。
virtual void ClearChunkList ();
備註
CDocument::ClearPathName
清除檔案物件的路徑。
virtual void ClearPathName();
備註
清除物件的路徑 CDocument
會導致應用程式在下一次儲存檔時提示使用者。 這會使 Save 命令的行為就像另存新檔命令一樣。
CDocument::DeleteContents
由架構呼叫以刪除文件的數據,而不會終結 CDocument
物件本身。
virtual void DeleteContents();
備註
它會在文件被終結之前呼叫。 它也會呼叫 ,以確保檔在重複使用之前是空的。 這對只使用一份檔的 SDI 應用程式來說特別重要:每當使用者建立或開啟另一份檔時,就會重複使用檔。 呼叫此函式以實作「編輯全部清除」或類似命令,以刪除檔的所有數據。 此函式的預設實作不做任何動作。 覆寫此函式以刪除文件中的數據。
範例
// This example is the handler for an Edit Clear All command.
void CExampleDoc::OnEditClearAll()
{
DeleteContents();
UpdateAllViews(NULL);
}
void CExampleDoc::DeleteContents()
{
// Re-initialize document data here.
}
CDocument::FindChunk
尋找具有指定 GUID 的區塊。
virtual POSITION FindChunk(
REFCLSID guid,
DWORD pid);
參數
guid
指定要尋找之區塊的 GUID。
pid
指定要尋找之區塊的 PID。
傳回值
如果成功,位於內部區塊清單中的位置。 否則 NULL
為 。
備註
CDocument::GetAdapter
傳回實作 IDocument
介面之物件的指標。
virtual ATL::IDocument* GetAdapter();
傳回值
實作 IDocument
介面之物件的指標。
備註
CDocument::GetDocTemplate
呼叫此函式以取得此文件類型之文件範本的指標。
CDocTemplate* GetDocTemplate() const;
傳回值
此檔案類型的檔範本指標,如果檔不是由文件範本管理,則為 NULL。
範例
// This example accesses the doc template object to construct
// a default document name such as SHEET.XLS, where "sheet"
// is the base document name and ".xls" is the file extension
// for the document type.
CString strDefaultDocName, strBaseName, strExt;
CDocTemplate *pDocTemplate = GetDocTemplate();
if (!pDocTemplate->GetDocString(strBaseName, CDocTemplate::docName) || !pDocTemplate->GetDocString(strExt, CDocTemplate::filterExt))
{
AfxThrowUserException(); // These doc template strings will
// be available if you created the application using AppWizard
// and specified the file extension as an option for
// the document class produced by AppWizard.
}
strDefaultDocName = strBaseName + strExt;
CDocument::GetFile
呼叫這個成員函式以取得 物件的指標 CFile
。
virtual CFile* GetFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError);
參數
lpszFileName
字串,這是所需檔案的路徑。 路徑可以是相對或絕對路徑。
pError
表示作業完成狀態的現有檔案例外狀況物件的指標。
nOpenFlags
共用和存取模式。 指定要在開啟檔案時採取的動作。 您可以使用位 OR (|
) 運算子,結合 CFile 建構CFile::CFile
函式中列出的選項。 需要一個訪問許可權和一個共享選項;和 modeCreate
modeNoInherit
模式是選擇性的。
傳回值
CFile
物件的指標。
CDocument::GetFirstViewPosition
呼叫此函式,以取得與文件相關聯之檢視清單中的第一個檢視位置。
virtual POSITION GetFirstViewPosition() const;
傳回值
POSITION
值,可用於與成員函式的GetNextView
反覆專案。
範例
//To get the first view in the list of views:
//To get the first view in the list of views:
// POSITION pos = GetFirstViewPosition();
// CView* pFirstView = GetNextView(pos);
//
// This example uses CDocument::GetFirstViewPosition
// and GetNextView to repaint each view.
// An easier way to accomplish the same result is to call
// UpdateAllViews(NULL);
void CExampleDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView *pView = GetNextView(pos);
pView->UpdateWindow();
}
}
CDocument::GetNextView
呼叫此函式以逐一查看檔的所有檢視。
virtual CView* GetNextView(POSITION& rPosition) const;
參數
rPosition
先前呼叫 GetNextView
或 GetFirstViewPosition
成員函式所傳回之值的參考POSITION
。 此值不得為 NULL
。
傳回值
所 rPosition
識別檢視的指標。
備註
函式會傳回 所 rPosition
識別的檢視,然後將 設定 rPosition
為 POSITION
清單中的下一個檢視值。 如果擷取的檢視是清單中的最後一個檢視,則會 rPosition
設定為 NULL
。
範例
//To get the first view in the list of views:
//To get the first view in the list of views:
// POSITION pos = GetFirstViewPosition();
// CView* pFirstView = GetNextView(pos);
//
// This example uses CDocument::GetFirstViewPosition
// and GetNextView to repaint each view.
// An easier way to accomplish the same result is to call
// UpdateAllViews(NULL);
void CExampleDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView *pView = GetNextView(pos);
pView->UpdateWindow();
}
}
CDocument::GetPathName
呼叫此函式以取得檔磁碟檔案的完整路徑。
const CString& GetPathName() const;
傳回值
檔的完整路徑。 如果檔尚未儲存或沒有與其相關聯的磁碟檔案,則此字串是空的。
CDocument::GetThumbnail
建立縮圖提供者用來顯示縮圖的點陣圖。
virtual BOOL GetThumbnail(
UINT cx,
HBITMAP* phbmp,
DWORD* pdwAlpha);
參數
cx
指定點圖的寬度和高度。
phbmp
當函式成功傳回時,包含點陣圖的句柄。
pdwAlpha
包含 DWORD
,指定成功傳回函式時的Alpha色板值。
傳回值
如果已成功建立縮圖的點陣圖,則傳 TRUE
回 ,否則 FALSE
傳回 。
備註
CDocument::GetTitle
呼叫此函式以取得文件的標題,該標題通常衍生自文件的檔名。
const CString& GetTitle() const;
傳回值
檔的標題。
CDocument::InitializeSearchContent
呼叫 以初始化搜尋處理程式的搜尋內容。
virtual void InitializeSearchContent ();
備註
覆寫衍生類別中的這個方法,以初始化搜尋內容。 內容應該是以 “;” 分隔部分的字串。 例如,「point;矩形;ole item”。
CDocument::IsModified
呼叫此函式,以判斷檔自上次儲存后是否已修改。
virtual BOOL IsModified();
傳回值
如果檔自上次儲存後已修改,則為非零;否則為 0。
CDocument::IsSearchAndOrganizeHandler
指出是否已針對 Search & Organize 處理程式建立這個 實例 CDocument
。
BOOL IsSearchAndOrganizeHandler() const;
傳回值
TRUE
如果已針對 Search & Organize 處理程式建立這個 實體CDocument
,則傳回 。
備註
此函式目前只會針對在行程伺服器外實作的 Rich Preview 處理程式傳回 TRUE
。 您可以在應用程式層級設定適當的旗標 (m_bPreviewHandlerMode
、 m_bSearchMode
m_bGetThumbnailMode
、 ),讓此函式傳回 TRUE
。
CDocument::LoadDocumentFromStream
呼叫 以從數據流載入文件數據。
virtual HRESULT LoadDocumentFromStream(
IStream* pStream,
DWORD dwGrfMode);
參數
pStream
數據流的指標。 殼層會提供此數據流。
dwGrfMode
數據流的存取模式。
傳回值
S_OK
如果載入作業成功,則為 ,否則 HRESULT
為錯誤碼。
備註
您可以在衍生類別中覆寫此方法,以自定義如何從數據流載入數據。
CDocument::m_bGetThumbnailMode
指定 CDocument
物件是由 dllhost 建立的縮圖。 應該簽入 CView::OnDraw
。
BOOL m_bGetThumbnailMode;
備註
TRUE
表示檔是由 dllhost 為縮圖所建立。
CDocument::m_bPreviewHandlerMode
指定 CDocument
物件是由 prevhost for Rich Preview 所建立。 應該簽入 CView::OnDraw
。
BOOL m_bPreviewHandlerMode;
備註
TRUE
表示檔是由 prevhost for Rich Preview 所建立。
CDocument::m_bSearchMode
指定 CDocument
物件是由索引器或其他搜尋應用程式所建立。
BOOL m_bSearchMode;
備註
TRUE
表示檔是由索引器或其他搜尋應用程式所建立。
CDocument::m_clrRichPreviewBackColor
指定 Rich Preview 視窗的背景色彩。 此色彩是由主機所設定。
COLORREF m_clrRichPreviewBackColor;
備註
CDocument::m_clrRichPreviewTextColor
指定 Rich Preview 視窗的前景色彩。 此色彩是由主機所設定。
COLORREF m_clrRichPreviewTextColor;
備註
CDocument::m_lfRichPreviewFont
指定 Rich Preview 視窗的文字字型。 此字型資訊是由主機所設定。
CFont m_lfRichPreviewFont;
備註
CDocument::OnBeforeRichPreviewFontChanged
在變更 Rich Preview 字型之前呼叫。
virtual void OnBeforeRichPreviewFontChanged();
備註
CDocument::OnChangedViewList
在檢視新增至檔或從檔中移除檢視之後,由架構呼叫。
virtual void OnChangedViewList();
備註
此函式的預設實作會檢查是否要移除最後一個檢視,如果是,則會刪除檔。 如果您想要在架構新增或移除檢視時執行特殊處理,請覆寫此函式。 例如,如果您希望檔保持開啟,即使沒有附加的檢視,請覆寫此函式。
CDocument::OnCloseDocument
文件關閉時由架構呼叫,通常是檔案關閉命令的一部分。
virtual void OnCloseDocument();
備註
此函式的預設實作會終結用於檢視檔、關閉檢視、清除文件內容的所有框架,然後呼叫 DeleteContents
成員函式來刪除文件的數據。
如果您想要在架構關閉檔時執行特殊清除處理,請覆寫此函式。 例如,如果檔代表資料庫中的記錄,您可能想要覆寫此函式來關閉資料庫。 您應該從覆寫呼叫此函式的基類版本。
CDocument::OnCreatePreviewFrame
當架構需要建立 Rich Preview 的預覽框架時,由架構呼叫。
virtual BOOL OnCreatePreviewFrame();
傳回值
如果成功建立框架,則傳 TRUE
回 ,否則 FALSE
傳回 。
備註
CDocument::OnDocumentEvent
架構呼叫以回應檔事件。
virtual void OnDocumentEvent(DocumentEvent deEvent);
參數
deEvent
[in]描述事件類型的列舉數據類型。
備註
檔事件可能會影響多個類別。 此方法負責處理影響類別以外的CDocument
類別的檔事件。 目前,唯一必須回應檔事件的類別是 CDataRecoveryHandler
類別。 類別 CDocument
有其他可覆寫的方法,負責處理 對的效果 CDocument
。
下表列出可能的值 deEvent
及其對應的事件。
值 | 對應的事件 |
---|---|
onAfterNewDocument |
已建立新的檔。 |
onAfterOpenDocument |
已開啟新檔。 |
onAfterSaveDocument |
已儲存檔。 |
onAfterCloseDocument |
檔案已關閉。 |
CDocument::OnDrawThumbnail
覆寫衍生類別中的這個方法,以繪製縮圖。
virtual void OnDrawThumbnail(
CDC& dc,
LPRECT lprcBounds);
參數
dc
裝置內容的參考。
lprcBounds
指定繪製縮圖的區域周框。
備註
CDocument::OnFileSendMail
透過常駐郵件主機傳送郵件(如果有的話),以檔做為附件。
void OnFileSendMail();
備註
OnFileSendMail
呼叫 OnSaveDocument
,將未命名和修改的檔串行化為臨時檔,然後透過電子郵件傳送。 如果檔尚未修改,則不需要暫存盤;會傳送原始的 。 OnFileSendMail
如果尚未載入,則會載入MAPI32.DLL。
的特殊實 OnFileSendMail
作,可 COleDocument
正確處理複合檔案。
CDocument
如果郵件支援 (MAPI) 存在,支援透過郵件傳送您的檔案。 請參閱 MFC 中的 MAPI 主題和 MAPI 支援文章。
CDocument::OnLoadDocumentFromStream
架構在需要從數據流載入文件數據時呼叫。
virtual HRESULT OnLoadDocumentFromStream(
IStream* pStream,
DWORD grfMode);
參數
pStream
傳入數據流的指標。
grfMode
數據流的存取模式。
傳回值
S_OK
如果載入成功,則為 ;否則為錯誤碼。
備註
CDocument::OnNewDocument
由架構呼叫做為 File New 命令的一部分。
virtual BOOL OnNewDocument();
傳回值
如果已成功初始化檔,則為非零;否則為 0。
備註
此函式的預設實作會呼叫 DeleteContents
成員函式,以確保檔是空的,然後將新文件標示為乾淨。 覆寫此函式,以初始化新文件的數據結構。 您應該從覆寫呼叫此函式的基類版本。
如果使用者在 SDI 應用程式中選擇 [檔案新增] 命令,架構會使用此函式來重新初始化現有的檔案,而不是建立新的檔。 如果使用者在多個檔介面 (MDI) 應用程式中選擇 [檔案新增],架構每次都會建立新的檔,然後呼叫此函式來初始化它。 您必須將此函式中的初始化程式代碼放在此函式中,而不是在建構函式中,讓 File New 命令在 SDI 應用程式中生效。
請注意,在某些情況下 OnNewDocument
會呼叫兩次。 當檔內嵌為 ActiveX 檔案伺服器時,就會發生這種情況。 方法會先呼叫函式(由CreateInstance
COleObjectFactory
衍生類別公開),第二次由 方法呼叫(由InitNew
COleServerDoc
衍生類別公開)。
範例
下列範例說明初始化檔物件的替代方法。
// Method 1: In an MDI application, the simplest place to do
// initialization is in the document constructor. The framework
// always creates a new document object for File New or File Open.
CExampleDoc::CExampleDoc()
{
// Do initialization of MDI document here.
}
// Method 2: In an SDI or MDI application, do all initialization
// in an override of OnNewDocument, if you are certain that
// the initialization is effectively saved upon File Save
// and fully restored upon File Open, via serialization.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
{
return FALSE;
}
// Do initialization of new document here.
return TRUE;
}
// Method 3: If the initialization of your document is not
// effectively saved and restored by serialization (during File Save
// and File Open), then implement the initialization in single
// function (named InitMyDocument in this example). Call the
// shared initialization function from overrides of both
// OnNewDocument and OnOpenDocument.
BOOL CExampleDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
{
return FALSE;
}
InitMyDocument(); // call your shared initialization function
// If your new document object requires additional initialization
// not necessary when the document is deserialized via File Open,
// then perform that additional initialization here.
return TRUE;
}
CDocument::OnOpenDocument
由架構呼叫做為檔案開啟命令的一部分。
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
參數
lpszPathName
指向要開啟的文件路徑。
傳回值
如果已成功載入檔,則為非零;否則為 0。
備註
此函式的預設實作會開啟指定的檔案、呼叫 DeleteContents
成員函式以確保檔是空的、呼叫 CObject::Serialize
以讀取檔案的內容,然後將文件標示為乾淨。 如果您想要使用封存機制或檔案機制以外的專案,請覆寫此函式。 例如,您可以撰寫應用程式,其中檔代表資料庫中的記錄,而不是個別的檔案。
如果使用者在 SDI 應用程式中選擇 [檔案開啟] 命令,架構會使用此函式來重新初始化現有的 CDocument
物件,而不是建立新的物件。 如果使用者在 MDI 應用程式中選擇 [檔案開啟],架構會每次建構新的 CDocument
物件,然後呼叫此函式來初始化它。 您必須將此函式中的初始化程式代碼放在此函式中,而不是在建構函式中,讓檔案開啟命令在 SDI 應用程式中生效。
範例
下列範例說明初始化檔物件的替代方法。
// Method 1: In an MDI application, the simplest place to do
// initialization is in the document constructor. The framework
// always creates a new document object for File New or File Open.
CExampleDoc::CExampleDoc()
{
// Do initialization of MDI document here.
}
// Method 2: In an SDI or MDI application, do all initialization
// in an override of OnNewDocument, if you are certain that
// the initialization is effectively saved upon File Save
// and fully restored upon File Open, via serialization.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
{
return FALSE;
}
// Do initialization of new document here.
return TRUE;
}
// Method 3: If the initialization of your document is not
// effectively saved and restored by serialization (during File Save
// and File Open), then implement the initialization in single
// function (named InitMyDocument in this example). Call the
// shared initialization function from overrides of both
// OnNewDocument and OnOpenDocument.
BOOL CExampleDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
{
return FALSE;
}
InitMyDocument(); // call your shared initialization function
// If your new document object requires additional initialization
// not necessary when the document is deserialized via File Open,
// then perform that additional initialization here.
return TRUE;
}
// Additional example of OnOpenDocument()
BOOL CExampleDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
{
return FALSE;
}
InitMyDocument(); // call your shared initialization function
return TRUE;
}
CDocument::OnPreviewHandlerQueryFocus
指示預覽處理程式傳回 HWND
從呼叫 函式擷取的 GetFocus
。
virtual HRESULT OnPreviewHandlerQueryFocus(HWND* phwnd);
參數
phwnd
[out]當這個方法傳回時,包含從預覽處理程式的前景線程呼叫 GetFocus
函式所傳回之 HWND 的指標。
傳回值
如果成功,則傳 S_OK
回 ;否則傳回錯誤值。
備註
CDocument::OnPreviewHandlerTranslateAccelerator
指示預覽處理程式處理從執行預覽處理程式之進程的訊息幫浦傳遞的擊鍵。
virtual HRESULT OnPreviewHandlerTranslateAccelerator(MSG* pmsg);
參數
pmsg
[in]視窗訊息的指標。
傳回值
如果預覽處理程式可以處理擊鍵訊息,處理程式會處理它並傳 S_OK
回 。 如果預覽處理程式無法處理擊鍵訊息,它會透過 IPreviewHandlerFrame::TranslateAccelerator
將它提供給主機。 如果主機處理訊息,這個方法會傳 S_OK
回 。 如果主機未處理訊息,這個方法會傳 S_FALSE
回 。
備註
CDocument::OnRichPreviewBackColorChanged
當 Rich Preview 背景色彩變更時呼叫。
virtual void OnRichPreviewBackColorChanged();
備註
CDocument::OnRichPreviewFontChanged
當 Rich Preview 字型變更時呼叫。
virtual void OnRichPreviewFontChanged();
備註
CDocument::OnRichPreviewSiteChanged
當 Rich Preview 網站變更時呼叫。
virtual void OnRichPreviewSiteChanged();
備註
CDocument::OnRichPreviewTextColorChanged
當 Rtf 預覽文字色彩變更時呼叫。
virtual void OnRichPreviewTextColorChanged();
備註
CDocument::OnSaveDocument
架構在 [檔案儲存] 或 [檔案另存新檔] 命令中呼叫。
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
參數
lpszPathName
指向應該儲存盤案的完整路徑。
傳回值
如果已成功儲存檔,則為非零;否則為 0。
備註
此函式的預設實作會開啟指定的檔案、呼叫 CObject::Serialize
將文件的數據寫入檔案,然後將文件標示為乾淨。 如果您想要在架構儲存檔時執行特殊處理,請覆寫此函式。 例如,您可以撰寫應用程式,其中檔代表資料庫中的記錄,而不是個別的檔案。
CDocument::OnUnloadHandler
卸除預覽處理程式時,由架構呼叫。
virtual void OnUnloadHandler();
備註
CDocument::OnUpdateFileSendMail
ID_FILE_SEND_MAIL
如果有郵件支援(MAPI),請啟用命令。
void OnUpdateFileSendMail(CCmdUI* pCmdUI);
參數
pCmdUI
與ID_FILE_SEND_MAIL
命令相關聯的對象指標CCmdUI
。
備註
否則,函式會 ID_FILE_SEND_MAIL
從功能表中移除命令,包括功能表項上方或下方的分隔符。 如果 MAPI32.DLL
MAPI存在於路徑中,而且在檔案的 [Mail] 區段中 WIN.INI
,MAPI=1 就會啟用。 大部分的應用程式都會將此命令放在 [檔案] 功能表上。
CDocument
如果郵件支援 (MAPI) 存在,支援透過郵件傳送您的檔案。 請參閱 MFC 中的 MAPI 主題和 MAPI 支援文章。
CDocument::PreCloseFrame
框架窗口終結之前,架構會呼叫此成員函式。
virtual void PreCloseFrame(CFrameWnd* pFrame);
參數
pFrame
CFrameWnd
保存相關聯CDocument
物件的指標。
備註
您可以覆寫以提供自定義清除,但請務必呼叫基類。
的預設值 PreCloseFrame
在中 CDocument
不會執行任何動作。 CDocument
衍生類別COleDocument
並使用CRichEditDoc
這個成員函式。
CDocument::ReadNextChunkValue
讀取下一個區塊值。
virtual BOOL ReadNextChunkValue(IFilterChunkValue** ppValue);
參數
ppValue
[out]當函式傳回時, ppValue
包含已讀取的值。
傳回值
如果成功則為非零;否則為 0。
備註
CDocument::ReleaseFile
架構會呼叫此成員函式來釋放檔案,使其可供其他應用程式使用。
virtual void ReleaseFile(
CFile* pFile,
BOOL bAbort);
參數
pFile
要釋放之 CFile
物件的指標。
bAbort
指定是否要使用 或 CFile::Abort
來釋放CFile::Close
檔案。 FALSE
如果要使用 CFile::Close
釋放檔案,則為 , TRUE
如果要使用 CFile::Abort
釋放檔案,則為 。
備註
如果 bAbort
為 TRUE
, ReleaseFile
則會呼叫 CFile::Abort
,並釋放檔案。 CFile::Abort
不會擲回例外狀況。
如果 bAbort
為 FALSE
, ReleaseFile
則會呼叫 CFile::Close
並釋放檔案。
覆寫此成員函式,以在釋放檔案之前要求使用者採取動作。
CDocument::RemoveChunk
拿掉具有指定 GUID
之的區塊。
virtual void RemoveChunk(
REFCLSID guid,
DWORD pid);
參數
Guid
指定要 GUID
移除的區塊的 。
Pid
指定要 PID
移除的區塊的 。
備註
CDocument::RemoveView
呼叫此函式以從檔卸離檢視。
void RemoveView(CView* pView);
參數
pView
指向要移除的檢視。
備註
此函式會從與文件相關聯的檢視清單中移除指定的檢視;它也會將檢視的檔案指標設定為 NULL
。 當框架視窗關閉或分割器視窗的窗格關閉時,架構會呼叫此函式。
只有在您手動中斷鏈接檢視時,才呼叫此函式。 一般而言,您會藉由定義 CDocTemplate
物件來建立檔類別、檢視類別和框架視窗類別的關聯,讓架構中斷連結檔和檢視。
如需範例實作,請參閱 的 AddView
範例。
CDocument::ReportSaveLoadException
如果儲存或載入檔案時擲回例外狀況(通常是 CFileException
或 CArchiveException
),則呼叫 。
virtual void ReportSaveLoadException(
LPCTSTR lpszPathName,
CException* e,
BOOL bSaving,
UINT nIDPDefault);
參數
lpszPathName
指向正在儲存或載入的檔案名稱。
e
指向擲回的例外狀況。 可以是 NULL
。
bSaving
指出正在進行中作業的旗標;如果正在儲存檔,則為非零,如果正在載入檔,則為0。
nIDPDefault
如果函式未指定更特定的錯誤訊息,則會顯示的錯誤訊息識別碼。
備註
默認實作會檢查例外狀況物件,並尋找特別描述原因的錯誤訊息。 如果找不到特定訊息,或 如果 e
為 NULL
,則會使用 參數所 nIDPDefault
指定的一般訊息。 函式接著會顯示包含錯誤訊息的消息框。 如果您想要提供其他自定義的失敗訊息,請覆寫此函式。 這是可覆寫的進階。
CDocument::SaveModified
在關閉修改的檔之前,由架構呼叫。
virtual BOOL SaveModified();
傳回值
如果繼續並關閉檔是安全的,則為非零;如果文件不應該關閉,則為 0。
備註
此函式的預設實作會顯示消息框,詢問使用者是否要儲存檔的變更,如果有的話。 如果您的程式需要不同的提示程式,請覆寫此函式。 這是可覆寫的進階。
CDocument::SetChunkValue
設定區塊值。
virtual BOOL SetChunkValue (IFilterChunkValue* pValue);
參數
pValue
指定要設定的區塊值。
傳回值
如果成功則為非零;否則為 0。
備註
CDocument::SetModifiedFlag
在對文件進行任何修改之後呼叫此函式。
virtual void SetModifiedFlag(BOOL bModified = TRUE);
參數
bModified
指出檔是否已修改的旗標。
備註
藉由一致呼叫此函式,您可確保架構會在關閉檔之前提示使用者儲存變更。 一般而言,您應該針對 bModified
參數使用 的預設值TRUE
。 若要將文件標示為乾淨(未修改),請使用的值 FALSE
呼叫此函式。
CDocument::SetPathName
呼叫此函式以指定檔磁碟檔案的完整路徑。
virtual void SetPathName(
LPCTSTR lpszPathName,
BOOL bAddToMRU = TRUE);
參數
lpszPathName
指向要當做文件路徑使用的字串。
bAddToMRU
判斷檔名是否新增至最近使用的 (MRU) 檔案清單。 如果 TRUE
為 ,則會新增檔名;如果 FALSE
為 ,則不會新增。
備註
視路徑的值 bAddToMRU
新增或未新增至應用程式所維護的 MRU 清單而定。 請注意,某些檔與磁碟檔案無關。 只有在覆寫預設實作以開啟和儲存架構所使用的檔案時,才呼叫此函式。
CDocument::SetTitle
呼叫此函式以指定檔的標題(框架視窗標題列中顯示的字串)。
virtual void SetTitle(LPCTSTR lpszTitle);
參數
lpszTitle
指向要當做文件標題使用的字串。
備註
呼叫此函式會更新顯示檔之所有框架視窗的標題。
CDocument::UpdateAllViews
在修改文件之後呼叫此函式。
void UpdateAllViews(
CView* pSender,
LPARAM lHint = 0L,
CObject* pHint = NULL);
參數
pSender
指向修改檔案的檢視,或 NULL
如果要更新所有檢視,則為 。
lHint
包含修改的相關信息。
pHint
指向儲存修改相關信息的物件。
備註
呼叫成員函式之後,您應該呼叫 SetModifiedFlag
此函式。 此函式會通知附加至檔的每個檢視,但 指定的 pSender
檢視已修改檔。 在使用者透過檢視變更文件之後,您通常會從檢視類別呼叫此函式。
此函式會針對檔的每個檢視呼叫 CView::OnUpdate
成員函式,但傳送檢視、傳遞 pHint
和 lHint
除外。 使用這些參數,將資訊傳遞至檔修改的相關檢視。 您可以使用 和/或定義CObject
衍生類別來編碼資訊lHint
,以儲存修改的相關信息,並使用 傳遞該類別pHint
的物件。 CView::OnUpdate
覆寫衍生類別中的CView
成員函式,以根據傳遞的資訊優化檢視顯示更新。
範例
void CExampleDoc::OnUpdateAllViews()
{
UpdateAllViews(NULL);
}
另請參閱
MFC 範例 MDIDOCVW
MFC 範例 SNAPVW
MFC 範例 NPP
CCmdTarget
類
階層架構圖表
CCmdTarget
類
CView
類
CDocTemplate
類