// [!output DOC_IMPL] : [!output DOC_CLASS] 类的实现 // #include "stdafx.h" #include "[!output APP_HEADER]" [!if OLEDB_RECORD_VIEW || ODBC_RECORD_VIEW] #include "[!output ROWSET_HEADER]" [!endif] #include "[!output DOC_HEADER]" [!if CONTAINER || CONTAINER_SERVER] #include "[!output CONTAINER_ITEM_HEADER]" [!endif] [!if MINI_SERVER || FULL_SERVER || CONTAINER_SERVER] #include "[!output SERVER_ITEM_HEADER]" [!endif] #ifdef _DEBUG #define new DEBUG_NEW #endif // [!output DOC_CLASS] IMPLEMENT_DYNCREATE([!output DOC_CLASS], [!output DOC_BASE_CLASS]) BEGIN_MESSAGE_MAP([!output DOC_CLASS], [!output DOC_BASE_CLASS]) [!if CONTAINER || CONTAINER_SERVER] // 启用默认的 OLE 容器实现 [!if !RICH_EDIT_VIEW] ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, &[!output DOC_BASE_CLASS]::OnUpdatePasteMenu) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_LINK, &[!output DOC_BASE_CLASS]::OnUpdatePasteLinkMenu) ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_CONVERT, &[!output DOC_BASE_CLASS]::OnUpdateObjectVerbMenu) ON_COMMAND(ID_OLE_EDIT_CONVERT, &[!output DOC_BASE_CLASS]::OnEditConvert) [!endif] ON_UPDATE_COMMAND_UI(ID_OLE_EDIT_LINKS, &[!output DOC_BASE_CLASS]::OnUpdateEditLinksMenu) ON_COMMAND(ID_OLE_EDIT_LINKS, &[!output DOC_BASE_CLASS]::OnEditLinks) ON_UPDATE_COMMAND_UI_RANGE(ID_OLE_VERB_FIRST, ID_OLE_VERB_LAST, &[!output DOC_BASE_CLASS]::OnUpdateObjectVerbMenu) [!endif] [!if MAPI] ON_COMMAND(ID_FILE_SEND_MAIL, &[!output DOC_CLASS]::OnFileSendMail) ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, &[!output DOC_CLASS]::OnUpdateFileSendMail) [!endif] END_MESSAGE_MAP() [!if AUTOMATION] BEGIN_DISPATCH_MAP([!output DOC_CLASS], [!output DOC_BASE_CLASS]) END_DISPATCH_MAP() // 注意: 我们添加了对 IID_I[!output SAFE_PROJECT_IDENTIFIER_NAME] 的支持 // 以支持来自 VBA 的类型安全绑定。此 IID 必须与附加在 .IDL 文件中的 // 调度接口的 GUID 匹配。 // {[!output DISPIID_REGISTRY_FORMAT]} static const IID IID_I[!output SAFE_PROJECT_IDENTIFIER_NAME] = [!output DISPIID_STATIC_CONST_GUID_FORMAT]; BEGIN_INTERFACE_MAP([!output DOC_CLASS], [!output DOC_BASE_CLASS]) INTERFACE_PART([!output DOC_CLASS], IID_I[!output SAFE_PROJECT_IDENTIFIER_NAME], Dispatch) END_INTERFACE_MAP() [!endif] // [!output DOC_CLASS] 构造/析构 [!output DOC_CLASS]::[!output DOC_CLASS]() { [!if SUPPORT_COMPOUND_FILES && !COMPOUND_DOC_NONE] // 使用 OLE 复合文件 EnableCompoundFile(); [!endif] // TODO: 在此添加一次性构造代码 [!if AUTOMATION] EnableAutomation(); AfxOleLockApp(); [!endif] } [!output DOC_CLASS]::~[!output DOC_CLASS]() { [!if AUTOMATION] AfxOleUnlockApp(); [!endif] } BOOL [!output DOC_CLASS]::OnNewDocument() { if (![!output DOC_BASE_CLASS]::OnNewDocument()) return FALSE; [!if APP_TYPE_SDI] [!if EDIT_VIEW] reinterpret_cast(m_viewList.GetHead())->SetWindowText(NULL); [!endif] [!endif] // TODO: 在此添加重新初始化代码 // (SDI 文档将重用该文档) return TRUE; } [!if RICH_EDIT_VIEW] [!output CONTAINER_ITEM_BASE_CLASS]* [!output DOC_CLASS]::CreateClientItem(REOBJECT* preo) const { return new [!output CONTAINER_ITEM_CLASS](preo, const_cast<[!output DOC_CLASS]*>(this)); } [!endif] [!if MINI_SERVER || FULL_SERVER || CONTAINER_SERVER] // [!output DOC_CLASS] 服务器实现 COleServerItem* [!output DOC_CLASS]::OnGetEmbeddedItem() { // OnGetEmbeddedItem 由框架调用以获取与该文档关联的 COleServerItem。 // 只在必要时才调用它。 [!output SERVER_ITEM_CLASS]* pItem = new [!output SERVER_ITEM_CLASS](this); ASSERT_VALID(pItem); return pItem; } [!endif] [!if ACTIVE_DOC_SERVER] // [!output DOC_CLASS] 活动文档服务器实现 CDocObjectServer *[!output DOC_CLASS]::GetDocObjectServer(LPOLEDOCUMENTSITE pDocSite) { return new CDocObjectServer(this, pDocSite); } [!endif] [!if !DB_VIEW_NO_FILE && !HTML_EDITVIEW] // [!output DOC_CLASS] 序列化 void [!output DOC_CLASS]::Serialize(CArchive& ar) { [!if EDIT_VIEW] // CEditView 包含一个处理所有序列化的编辑控件 reinterpret_cast(m_viewList.GetHead())->SerializeRaw(ar); [!else] if (ar.IsStoring()) { // TODO: 在此添加存储代码 } else { // TODO: 在此添加加载代码 } [!if CONTAINER || CONTAINER_SERVER] // 调用基类 [!output DOC_BASE_CLASS] 将启用 // 容器文档的 COleClientItem 对象的序列化。 [!if RICH_EDIT_VIEW] // TODO: 如果作为文本进行序列化,则设置 CRichEditDoc::m_bRTF = FALSE [!endif] [!output DOC_BASE_CLASS]::Serialize(ar); [!if ACTIVE_DOC_CONTAINER] // 激活第一个 if (!ar.IsStoring()) { POSITION posItem = GetStartPosition(); if (posItem != NULL) { CDocItem* pItem = GetNextItem(posItem); POSITION posView = GetFirstViewPosition(); COleDocObjectItem *pDocObjectItem = DYNAMIC_DOWNCAST(COleDocObjectItem, pItem); if (posView != NULL && pDocObjectItem != NULL) { CView* pView = GetNextView(posView); pDocObjectItem->DoVerb(OLEIVERB_SHOW, pView); } } } [!endif] [!endif] [!endif] } [!endif] // [!output DOC_CLASS] 诊断 #ifdef _DEBUG void [!output DOC_CLASS]::AssertValid() const { [!output DOC_BASE_CLASS]::AssertValid(); } void [!output DOC_CLASS]::Dump(CDumpContext& dc) const { [!output DOC_BASE_CLASS]::Dump(dc); } #endif //_DEBUG // [!output DOC_CLASS] 命令