// [!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 파일의 dispinterface에 첨부된 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() { // 문서와 관련된 COleServerItem을 가져오기 위해 프레임워크에서 OnGetEmbeddedItem을 // 호출합니다. 이것은 필요할 때만 호출됩니다. [!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] serialization void [!output DOC_CLASS]::Serialize(CArchive& ar) { [!if EDIT_VIEW] // CEditView에는 모든 serialization을 처리하는 edit 컨트롤이 들어 있습니다. reinterpret_cast(m_viewList.GetHead())->SerializeRaw(ar); [!else] if (ar.IsStoring()) { // TODO: 여기에 저장 코드를 추가합니다. } else { // TODO: 여기에 로딩 코드를 추가합니다. } [!if CONTAINER || CONTAINER_SERVER] // 기본 클래스인 [!output DOC_BASE_CLASS]를 호출하면 컨테이너 문서의 COleClientItem 개체에 대한 serialization이 // 활성화됩니다. [!if RICH_EDIT_VIEW] // TODO: 텍스트로 serialize할 경우 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] 명령