📄 dsofauto.cpp
字号:
LPWSTR pwszAltProgId = LPWSTR_FROM_VARIANT(ProgId);
LPWSTR pwszUserName = LPWSTR_FROM_VARIANT(WebUsername);
LPWSTR pwszPassword = LPWSTR_FROM_VARIANT(WebPassword);
BOOL fOpenReadOnly = BOOL_FROM_VARIANT(ReadOnly, FALSE);
CLSID clsidAlt = GUID_NULL;
HCURSOR hCur;
IUnknown* punk = NULL;
BIND_OPTS bopts = {sizeof(BIND_OPTS), BIND_MAYBOTHERUSER, 0, 10000};
TRACE1("CDsoFramerControl::Open(%S)\n", pwszDocument);
// We must have either a string (file path or URL) or an object to open from...
if (!(pwszDocument) || (*pwszDocument == L'\0'))
{
if (!(pwszDocument) && ((punk = PUNK_FROM_VARIANT(Document)) == NULL))
return E_INVALIDARG;
}
// If the user passed the ProgId, find the alternative CLSID for server...
if ((pwszAltProgId) && FAILED(CLSIDFromProgID(pwszAltProgId, &clsidAlt)))
return E_INVALIDARG;
// Cannot create object if we are not activate yet, or if in modal condition...
if (!(m_fInPlaceActive) || (m_fModalState))
return ProvideErrorInfo(DSO_E_INMODALSTATE);
// OK. If here, all the parameters look good and it is time to try and open
// the document object. Start by closing any existing document first...
if ((m_pDocObjFrame) && FAILED(hr = Close()))
return hr;
// Make sure we are the active component for this process...
if (FAILED(hr = Activate())) return hr;
// Let's make a doc frame for ourselves...
if (!(m_pDocObjFrame = CDsoDocObject::CreateInstance((IDsoDocObjectSite*)&m_xDsoDocObjectSite)))
return E_OUTOFMEMORY;
// If we had delayed the frame hook, we should set it up now...
if (!(m_pHookManager) && FDelayFrameHookSet())
{
m_pHookManager = CDsoFrameHookManager::RegisterFramerControl(m_hwndParent, m_hwnd);
if (!m_pHookManager) return ProvideErrorInfo(DSO_E_FRAMEHOOKFAILED);
}
// Start a wait operation to notify user...
hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
m_fInDocumentLoad = TRUE;
// Setup the bind options based on read-only flag....
bopts.grfMode = (STGM_TRANSACTED | STGM_SHARE_DENY_WRITE | (fOpenReadOnly ? STGM_READ : STGM_READWRITE));
SEH_TRY
// Normally user gives a string that is path to file...
if (pwszDocument)
{
// Check if we are opening from a URL, and load that way...
if (LooksLikeHTTP(pwszDocument))
{
hr = m_pDocObjFrame->CreateFromURL(pwszDocument, clsidAlt, &bopts, pwszUserName, pwszPassword);
}
// Otherwise, check if it is a local file and open that...
else if (FFileExists(pwszDocument))
{
hr = m_pDocObjFrame->CreateFromFile(pwszDocument, clsidAlt, &bopts);
}
else hr = E_INVALIDARG;
}
else if (punk)
{
// If we have an object to load from, try loading it direct...
hr = m_pDocObjFrame->CreateFromRunningObject(punk, NULL, &bopts);
}
else hr = E_UNEXPECTED; // Unhandled load type??
// If successful, we can activate the object...
if (SUCCEEDED(hr))
{
EnableDropFile(FALSE);
if (!m_fShowToolbars)
m_pDocObjFrame->OnNotifyChangeToolState(FALSE);
hr = m_pDocObjFrame->IPActivateView();
}
SEH_EXCEPT(hr)
// Force a close if an error occurred...
if (FAILED(hr))
{
m_fFreezeEvents = TRUE;
Close();
m_fFreezeEvents = FALSE;
hr = ProvideErrorInfo(hr);
}
else
{
// Fire the OnDocumentOpened event...
VARIANT rgargs[2];
rgargs[0].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[0].pdispVal));
rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = SysAllocString(pwszDocument);
RaiseAutomationEvent(DSOF_DISPID_DOCOPEN, 2, rgargs);
VariantClear(&rgargs[1]);
VariantClear(&rgargs[0]);
// Ensure we are active control...
Activate();
// Redraw the caption as needed...
RedrawCaption();
}
m_fInDocumentLoad = FALSE;
SetCursor(hCur);
return hr;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::Save
//
// Saves the current object. The optional SaveAs paramter lets the same
// function act as a SaveAs method.
//
STDMETHODIMP CDsoFramerControl::Save(VARIANT SaveAsDocument, VARIANT OverwriteExisting, VARIANT WebUsername, VARIANT WebPassword)
{
HCURSOR hCur;
HRESULT hr = S_FALSE;
LPWSTR pwszDocument = LPWSTR_FROM_VARIANT(SaveAsDocument);
LPWSTR pwszUserName = LPWSTR_FROM_VARIANT(WebUsername);
LPWSTR pwszPassword = LPWSTR_FROM_VARIANT(WebPassword);
BOOL fOverwrite = BOOL_FROM_VARIANT(OverwriteExisting, FALSE);
TRACE1("CDsoFramerControl::Save(%S)\n", pwszDocument);
CHECK_NULL_RETURN(m_pDocObjFrame, ProvideErrorInfo(DSO_E_DOCUMENTNOTOPEN));
// Cannot access object if in modal condition...
if ((m_fModalState) || (m_fNoInteractive))
return ProvideErrorInfo(DSO_E_INMODALSTATE);
// If user passed a value for SaveAs, it must be a valid string...
if (!(PARAM_IS_MISSING(&SaveAsDocument)) &&
((pwszDocument == NULL) || (*pwszDocument == L'\0')))
return E_INVALIDARG;
// Raise the BeforeDocumentSaved event to host...
if (m_dispEvents)
{
VARIANT rgargs[3]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
rgargs[2].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[2].pdispVal));
rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = SysAllocString(pwszDocument);
rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;
RaiseAutomationEvent(DSOF_DISPID_BDOCSAVE, 3, rgargs);
VariantClear(&rgargs[2]);
VariantClear(&rgargs[1]);
// Setting Cancel param will abort the save...
if (vtboolCancel != VARIANT_FALSE)
return E_ABORT;
}
// Now do the save...
hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
SEH_TRY
// Determine if they want to save to a URL...
if ((pwszDocument) && LooksLikeHTTP(pwszDocument))
{
hr = m_pDocObjFrame->SaveToURL(pwszDocument, fOverwrite, pwszUserName, pwszPassword);
}
else if (pwszDocument)
{
// Save to file (local or UNC)...
hr = m_pDocObjFrame->SaveToFile(pwszDocument, fOverwrite);
}
else
{
// Save back to open location...
hr = m_pDocObjFrame->Save();
}
SEH_EXCEPT(hr)
// If save was successful...
if (SUCCEEDED(hr))
{
// Raise the SaveComplete event to host...
if (m_dispEvents)
{
VARIANT rgargs[3];
rgargs[2].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[2].pdispVal));
rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = SysAllocString(m_pDocObjFrame->GetSourceDocName());
rgargs[0].vt = VT_BSTR; rgargs[0].bstrVal = SysAllocString(m_pDocObjFrame->GetSourceName());
RaiseAutomationEvent(DSOF_DISPID_SAVECOMPLETE, 3, rgargs);
VariantClear(&rgargs[2]);
VariantClear(&rgargs[1]);
VariantClear(&rgargs[0]);
}
// Redraw the caption as needed...
RedrawCaption();
}
SetCursor(hCur);
return ProvideErrorInfo(hr);
}
////////////////////////////////////////////////////////////////////////
//CDsoFramerControl::OpenComments
// OpenComments the current object.
STDMETHODIMP CDsoFramerControl::OpenComments()
{
ODS("CDsoFramerControl::Close\n");
CDsoDocObject* pdframe = m_pDocObjFrame;
if (pdframe)
{
//RaiseAutomationEvent(DSOF_DISPID_DefineTools, 1, NULL);
// Fire the BeforeDocumentClosed event to give host chance to cancel...
VARIANT rgargs[2]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
rgargs[1].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[1].pdispVal));
rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;
// Setting Cancel param should abort the close...
RaiseAutomationEvent(DSOF_DISPID_DefineTools, 2, rgargs);
VariantClear(&rgargs[1]);
if (vtboolCancel != VARIANT_FALSE)
return E_ABORT;
// If not canceled, clear the member variable then call close on doc frame...
m_pDocObjFrame = NULL;
SEH_TRY
//pdframe->Close();
SEH_EXCEPT_NULL
delete pdframe;
// Notify host that item is now closed...
RaiseAutomationEvent(DSOF_DISPID_DefineTools, 0, NULL);
}
RedrawCaption();
EnableDropFile(TRUE);
return S_OK;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::Close
//
// Closes the current object.
//
STDMETHODIMP CDsoFramerControl::Close()
{
ODS("CDsoFramerControl::Close\n");
CDsoDocObject* pdframe = m_pDocObjFrame;
if (pdframe)
{
// Fire the BeforeDocumentClosed event to give host chance to cancel...
VARIANT rgargs[2]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
rgargs[1].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[1].pdispVal));
rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;
// Setting Cancel param should abort the close...
RaiseAutomationEvent(DSOF_DISPID_BDOCCLOSE, 2, rgargs);
VariantClear(&rgargs[1]);
if (vtboolCancel != VARIANT_FALSE)
return E_ABORT;
// If not canceled, clear the member variable then call close on doc frame...
m_pDocObjFrame = NULL;
SEH_TRY
pdframe->Close();
SEH_EXCEPT_NULL
delete pdframe;
// Notify host that item is now closed...
RaiseAutomationEvent(DSOF_DISPID_DOCCLOSE, 0, NULL);
}
// Redraw the caption as needed...
RedrawCaption();
EnableDropFile(TRUE);
return S_OK;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::(put_Caption/get_Caption)
//
// Allows you to set a custom cation for the titlebar.
//
STDMETHODIMP CDsoFramerControl::put_Caption(BSTR bstr)
{
// Free exsiting caption (if any) and save new one (always dirties control)...
SAFE_FREEBSTR(m_bstrCustomCaption);
// Set the new one (if provided)...
if ((bstr) && (SysStringLen(bstr) > 0))
m_bstrCustomCaption = SysAllocString(bstr);
ViewChanged();
m_fDirty = TRUE;
return S_OK;
}
STDMETHODIMP CDsoFramerControl::get_Caption(BSTR* pbstr)
{
if (pbstr) *pbstr = (m_bstrCustomCaption ?
SysAllocString(m_bstrCustomCaption) :
SysAllocString(L"Office Framer Control"));
return S_OK;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::(put_Titlebar/get_Titlebar)
//
// True/False. Should we display the titlebar or not?
//
STDMETHODIMP CDsoFramerControl::put_Titlebar(VARIANT_BOOL vbool)
{
TRACE1("CDsoFramerControl::put_Titlebar(%d)\n", vbool);
if (m_fModalState) // Cannot access object if in modal condition...
return ProvideErrorInfo(DSO_E_INMODALSTATE);
if (m_fShowTitlebar != (WORD)(BOOL)vbool)
{
m_fShowTitlebar = (BOOL)vbool;
m_fDirty = TRUE;
OnResize();
ViewChanged();
}
return S_OK;
}
STDMETHODIMP CDsoFramerControl::get_Titlebar(VARIANT_BOOL* pbool)
{
ODS("CDsoFramerControl::get_Titlebar\n");
if (pbool) *pbool = (m_fShowTitlebar ? VARIANT_TRUE : VARIANT_FALSE);
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -