📄 olesvr1.cpp
字号:
SaveEmbedding();
}
CATCH_ALL(e)
{
AfxMessageBox(AFX_IDP_FAILED_TO_UPDATE);
DELETE_EXCEPTION(e);
return FALSE;
}
END_CATCH_ALL
return TRUE;
}
LPMONIKER COleServerDoc::GetMoniker(OLEGETMONIKER nAssign)
{
ASSERT_VALID(this);
if (m_lpClientSite != NULL)
{
// get moniker from client site instead of from document
LPMONIKER lpMoniker = NULL;
m_lpClientSite->GetMoniker(nAssign, OLEWHICHMK_OBJFULL, &lpMoniker);
return lpMoniker;
}
return COleLinkingDoc::GetMoniker(nAssign);
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc document handling
BOOL COleServerDoc::SaveModified()
{
ASSERT_VALID(this);
if (m_lpClientSite != NULL)
{
if (m_pInPlaceFrame == NULL)
{
UpdateModifiedFlag(); // check for modified items
OnUpdateDocument();
}
return TRUE;
}
return COleLinkingDoc::SaveModified();
}
HMENU COleServerDoc::GetDefaultMenu()
{
ASSERT_VALID(this);
CDocTemplate* pTemplate = GetDocTemplate();
if (pTemplate == NULL)
return NULL; // no doc template -- use default
ASSERT_VALID(pTemplate);
if (m_pInPlaceFrame != NULL)
return pTemplate->m_hMenuInPlaceServer; // return special in-place menu
else if (m_lpClientSite != NULL)
return pTemplate->m_hMenuEmbedding; // return special embedding menu
return NULL; // no special mode, use default menu
}
HACCEL COleServerDoc::GetDefaultAccelerator()
{
ASSERT_VALID(this);
CDocTemplate* pTemplate = GetDocTemplate();
if (pTemplate == NULL)
return NULL; // no doc template -- use default
ASSERT_VALID(pTemplate);
if (m_pInPlaceFrame != NULL)
return pTemplate->m_hAccelInPlaceServer; // return special in-place accel
else if (m_lpClientSite != NULL)
return pTemplate->m_hAccelEmbedding;// return special embedding accel
return NULL; // no special mode, use default menu
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc default command handling
BEGIN_MESSAGE_MAP(COleServerDoc, COleLinkingDoc)
//{{AFX_MSG_MAP(COleServerDoc)
ON_COMMAND(ID_FILE_UPDATE, OnFileUpdate)
ON_COMMAND(ID_FILE_SAVE_COPY_AS, OnFileSaveCopyAs)
ON_UPDATE_COMMAND_UI(ID_APP_EXIT, OnUpdateFileExit)
ON_UPDATE_COMMAND_UI(ID_FILE_UPDATE, OnUpdateFileUpdate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void COleServerDoc::OnFileUpdate()
{
ASSERT_VALID(this);
ASSERT(m_lpClientSite != NULL);
UpdateModifiedFlag();
OnUpdateDocument();
}
void COleServerDoc::OnFileSaveCopyAs()
{
ASSERT_VALID(this);
ASSERT(m_bRemember);
ASSERT(m_lpClientSite != NULL);
LPSTORAGE lpOrigStg = m_lpRootStg;
m_lpRootStg = NULL; // ignore embedded storage for now
TRY
{
// call DoSave to perform Save Copy As...
m_bRemember = FALSE;
DoSave(NULL, FALSE);
}
END_TRY
m_lpRootStg = lpOrigStg;
m_bRemember = TRUE;
}
void COleServerDoc::UpdateUsingHostObj(UINT nIDS, CCmdUI* pCmdUI)
{
ASSERT_VALID(this);
ASSERT(pCmdUI != NULL);
if (m_lpClientSite == NULL)
return;
// update menu item using m_strHostObj
CString str;
AfxFormatString1(str, nIDS, m_strHostObj);
if (!str.IsEmpty())
pCmdUI->SetText(str);
}
void COleServerDoc::OnUpdateFileExit(CCmdUI* pCmdUI)
{
ASSERT_VALID(this);
ASSERT(pCmdUI != NULL);
UpdateUsingHostObj(AFX_IDS_EXIT_MENU, pCmdUI);
}
void COleServerDoc::OnUpdateFileUpdate(CCmdUI* pCmdUI)
{
ASSERT_VALID(this);
ASSERT(pCmdUI != NULL);
UpdateUsingHostObj(AFX_IDS_UPDATE_MENU, pCmdUI);
}
BOOL COleServerDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
ASSERT_VALID(this);
ASSERT(lpszPathName == NULL || AfxIsValidString(lpszPathName));
BOOL bModified = IsModified();
BOOL bRemember = m_bRemember;
if (!COleLinkingDoc::OnSaveDocument(lpszPathName))
return FALSE;
if (!bRemember)
SetModifiedFlag(bModified);
if (lpszPathName != NULL && bRemember)
{
if (AfxComparePath(GetPathName(), lpszPathName))
NotifySaved();
}
return TRUE;
}
void COleServerDoc::OnCloseDocument()
{
ASSERT_VALID(this);
// don't allow in-place active documents to be closed without first
// deactivating them!
if (m_pInPlaceFrame != NULL)
{
if (GetFirstViewPosition() != NULL)
return;
// no views but currently in-place active indicates that
// a WM_ENDSESSION is being processed.
m_pInPlaceFrame = NULL;
}
InternalAddRef(); // keep document stable during shutdown
// update lock count before sending notifications
UpdateVisibleLock(FALSE, FALSE);
// send some notifications to the container
if (m_lpClientSite != NULL && m_bCntrVisible)
{
// allow the container to unshade the object appropriately
m_lpClientSite->OnShowWindow(FALSE);
m_bCntrVisible = FALSE;
}
// send close notification
NotifyClosed();
// finish closing the document (before m_lpClientSite->Release)
BOOL bAutoDelete = m_bAutoDelete;
m_bAutoDelete = FALSE;
COleLinkingDoc::OnCloseDocument();
ASSERT_VALID(this);
// release client-site pointer
RELEASE(m_lpClientSite);
// disconnect the object
LPUNKNOWN lpUnknown = (LPUNKNOWN)GetInterface(&IID_IUnknown);
ASSERT(lpUnknown != NULL);
CoDisconnectObject(lpUnknown, 0);
// destroy the document if allowed
InterlockedDecrement(&m_dwRef); // remove InternalAddRef above
if (bAutoDelete)
delete this;
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc show/hide
void COleServerDoc::OnShowDocument(BOOL bShow)
{
ASSERT_VALID(this);
CWinApp* pApp = AfxGetApp();
if (bShow)
{
// deactivate in-place session if active
if (m_pInPlaceFrame != NULL)
{
OnDeactivate();
ASSERT(m_pInPlaceFrame == NULL);
}
// find the first view of this document
CFrameWnd* pFrameWnd;
if ((pFrameWnd = GetFirstFrame()) != NULL)
{
// allow container to show & scroll to the object
if (!pFrameWnd->IsWindowVisible() && m_lpClientSite != NULL)
m_lpClientSite->ShowObject();
// activate frame holding view
ASSERT_VALID(pFrameWnd);
pFrameWnd->ActivateFrame();
// activate application if necessary
CFrameWnd* pAppFrame = pFrameWnd->GetParentFrame();
if (pAppFrame != NULL)
{
pFrameWnd = pAppFrame;
ASSERT_VALID(pFrameWnd);
ASSERT_KINDOF(CFrameWnd, pFrameWnd);
pFrameWnd->ActivateFrame();
}
pFrameWnd->GetLastActivePopup()->SetForegroundWindow();
// update the menu and title as appropriate for this document
pFrameWnd->OnUpdateFrameMenu(NULL);
pFrameWnd->OnUpdateFrameTitle(TRUE);
}
else if (pApp->m_pMainWnd != NULL)
{
// otherwise, just show the main window (for simple servers)
CWnd* pWnd = AfxGetMainWnd();
// allow container to show & scroll to the object
if (!pWnd->IsWindowVisible() && m_lpClientSite != NULL)
m_lpClientSite->ShowObject();
pWnd->ShowWindow(SW_SHOW);
pWnd->SetActiveWindow();
pWnd->SetForegroundWindow();
}
// for file based documents, showing the document puts user in control.
if (!m_bEmbedded)
AfxOleSetUserCtrl(TRUE);
}
else
{
if (m_pInPlaceFrame != NULL)
{
// hide has semantics of DeactivateUI if the item is active
if (m_pInPlaceFrame->m_bUIActive)
OnDeactivateUI(FALSE);
// and then hide the frame itself
if (m_pInPlaceFrame != NULL)
m_pInPlaceFrame->ActivateFrame(SW_HIDE);
return;
}
// find the first view of this document
POSITION pos = GetFirstViewPosition();
if (pos != NULL)
{
CFrameWnd* pDocFrame = GetFirstFrame();
CFrameWnd* pActiveFrame = NULL;
CFrameWnd* pMainFrame = NULL;
CView* pView = GetNextView(pos);
ASSERT_VALID(pView);
// destroy or hide all the frames for this document
// (the main for the document is hidden, where the alternate
// frames are simply destroyed)
do
{
// hide frame holding view
CFrameWnd* pFrame = pView->GetParentFrame();
ASSERT_VALID(pFrame);
// determine next valid view before destroying the frame
while ((pView = GetNextView(pos)) != NULL)
{
if (pView->GetParentFrame() != pFrame)
break;
}
pMainFrame = pFrame->GetParentFrame();
if (pMainFrame != NULL && pMainFrame->GetActiveFrame() == pFrame)
{
// don't destroy the active frame until later
pActiveFrame = pFrame;
}
else
{
// not the active frame -- destroy/hide it now
PreCloseFrame(pFrame);
if (pDocFrame == pFrame)
pFrame->ActivateFrame(SW_HIDE);
else
pFrame->DestroyWindow();
}
} while (pView != NULL);
// hide the active frame last
if (pActiveFrame != NULL)
{
PreCloseFrame(pActiveFrame);
if (pDocFrame == pActiveFrame)
pActiveFrame->ActivateFrame(SW_HIDE);
else
pActiveFrame->DestroyWindow();
// should leave at least one frame
ASSERT_VALID(this);
ASSERT_VALID(GetFirstFrame());
}
}
CFrameWnd* pMainFrame = (CFrameWnd*)pApp->m_pMainWnd;
if (!AfxOleGetUserCtrl() && pMainFrame != NULL &&
pMainFrame->IsWindowEnabled() && pMainFrame->IsFrameWnd() &&
pMainFrame->GetActiveFrame() == pMainFrame)
{
// hide the entire application -- no visible documents left
pApp->HideApplication();
}
}
// send OnShowWindow notifications to the container
if (m_lpClientSite != NULL && (bShow || m_bCntrVisible != bShow))
{
// allow the container to shade the object appropriately
m_lpClientSite->OnShowWindow(bShow);
m_bCntrVisible = bShow;
}
// force update visible lock
if (bShow)
UpdateVisibleLock(TRUE, FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc storage implementation
void COleServerDoc::OnNewEmbedding(LPSTORAGE lpStorage)
{
ASSERT_VALID(this);
ASSERT(lpStorage != NULL);
// save state
BOOL bUserCtrl = AfxOleGetUserCtrl();
TRY
{
// remember new storage
DeleteContents();
lpStorage->AddRef();
RELEASE(m_lpRootStg);
m_lpRootStg = lpStorage;
m_strPathName.Empty();
m_bEmbedded = TRUE;
// do document initialization by calling OnNewDocument
if (!OnNewDocument())
AfxThrowMemoryException();
}
CATCH_ALL(e)
{
// restore state
AfxOleSetUserCtrl(bUserCtrl);
THROW_LAST();
}
END_CATCH_ALL
// restore state
AfxOleSetUserCtrl(bUserCtrl);
SetModifiedFlag(); // new storage-based documents are dirty!
SendInitialUpdate();
}
void COleServerDoc::OnOpenEmbedding(LPSTORAGE lpStorage)
{
ASSERT_VALID(this);
ASSERT(lpStorage != NULL);
// save state
BOOL bUserCtrl = AfxOleGetUserCtrl();
TRY
{
// abort changes to current document
DeleteContents();
lpStorage->AddRef();
RELEASE(m_lpRootStg);
m_lpRootStg = lpStorage;
// open document from the sub-storage
if (!OnOpenDocument(NULL))
AfxThrowMemoryException();
// now document is storage based
m_strPathName.Empty();
m_bEmbedded = TRUE;
}
CATCH_ALL(e)
{
// restore state
AfxOleSetUserCtrl(bUserCtrl);
THROW_LAST();
}
END_CATCH_ALL
// restore state
AfxOleSetUserCtrl(bUserCtrl);
SetModifiedFlag(FALSE); // start off with unmodified
SendInitialUpdate();
}
void COleServerDoc::OnSaveEmbedding(LPSTORAGE lpStorage)
{
ASSERT_VALID(this);
ASSERT(lpStorage != NULL);
// save state
BOOL bUserCtrl = AfxOleGetUserCtrl();
// check for save as
LPSTORAGE lpOrigStg = m_lpRootStg;
if (!m_bSameAsLoad)
{
// File Save[Copy] As (saving to different file)
ASSERT(lpStorage != NULL);
m_lpRootStg = lpStorage;
}
TRY
{
// save document to the sub-storage
if (!OnSaveDocument(NULL))
AfxThrowMemoryException();
}
CATCH_ALL(e)
{
// restore state
AfxOleSetUserCtrl(bUserCtrl);
// re-attach original storage
m_lpRootStg = lpOrigStg;
THROW_LAST();
}
END_CATCH_ALL
// restore state
AfxOleSetUserCtrl(bUserCtrl);
// re-attach original storage
m_lpRootStg = lpOrigStg;
}
/////////////////////////////////////////////////////////////////////////////
// COleServerDoc in-place activation implementation
AFX_STATIC HWND AFXAPI _AfxGetWindow32(HWND hWnd)
{
// don't bother if hWnd is already a 32-bit HWND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -