📄 kyofficectrl.cpp
字号:
// KyOfficeCtrl.cpp : Implementation of CKyOfficeCtrl
#include "stdafx.h"
#include "KyOffice.h"
#include "MainFrm.h"
#include "CntrItem.h"
#include "DocManagerEx.h"
#include "KyOfficeDoc.h"
#include "KyOfficeView.h"
#include "KyOfficeCtrl.h"
#include "InPlacePrevw.h"
/////////////////////////////////////////////////////////////////////////////
// CKyOfficeCtrl
CKyOfficeCtrl::CKyOfficeCtrl()
{
m_bWindowOnly = TRUE;
m_szOldUserName = _T("");
m_szWordUserName = _T("");
}
LRESULT CKyOfficeCtrl::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
CKyOfficeApp * pTheApp = (CKyOfficeApp*)AfxGetApp();
ASSERT_VALID(pTheApp);
if(pTheApp->CreateFramework())
m_pMainFrame = (CMainFrame*)pTheApp->m_pMainWnd;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
m_pMainFrame->ModifyStyle(WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, WS_CHILD|WS_CLIPCHILDREN, SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW);
::SetParent(m_pMainFrame->GetSafeHwnd(), m_hWnd);
m_pMainFrame->SetOfficeCtrl(this);
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
pActiveView->SetOfficeCtrl(this);
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
pDocument->SetOfficeCtrl(this);
}
return 0;
}
LRESULT CKyOfficeCtrl::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
m_pMainFrame->SendMessage(WM_CLOSE);
return 0;
}
LRESULT CKyOfficeCtrl::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
m_pMainFrame->MoveWindow(0, 0, LOWORD(lParam), HIWORD(lParam));
return 0;
}
HRESULT CKyOfficeCtrl::OnDraw(ATL_DRAWINFO& di)
{
return S_OK;
}
LRESULT CKyOfficeCtrl::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
//先关闭当前文档
CloseFile();
return 0;
}
STDMETHODIMP CKyOfficeCtrl::ShowOpenDialog()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CKyOfficeApp * pTheApp = (CKyOfficeApp*)AfxGetApp();
ASSERT_VALID(pTheApp);
if(m_pMainFrame)
pTheApp->OnFileOpen();
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::OpenFile(BSTR bstrFilePath, VARIANT_BOOL * pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
USES_CONVERSION;
LPCTSTR lpstrPathName = W2A(bstrFilePath);
CFileStatus st;
if(CFile::GetStatus(lpstrPathName, st))
{
*pVal = AfxGetApp()->OpenDocumentFile(lpstrPathName) != NULL ? VARIANT_TRUE : VARIANT_FALSE;
}
else
{
CString szText;
szText.Format("指定的文件 '%s' 不存在!", lpstrPathName);
AfxMessageBox(szText, MB_OK|MB_ICONERROR);
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::CloseFile()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
CWaitCursor w;
pActiveView->DoCloseDocument();
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::SaveAs(BSTR bstrNewFilePath, VARIANT_BOOL bReplace, VARIANT_BOOL * pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
USES_CONVERSION;
LPCTSTR lpstrPathName = W2A(bstrNewFilePath);
if(pDocument->GetDocItem() != NULL)
{
CWaitCursor w;
*pVal = pDocument->DoSave(lpstrPathName, bReplace) == TRUE ? VARIANT_TRUE : VARIANT_FALSE;
}
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::ShowSaveAsDialog(VARIANT_BOOL bReplace, VARIANT_BOOL *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
if(pDocument->GetDocItem() != NULL)
{
CWaitCursor w;
*pVal = pDocument->DoSave(NULL, bReplace) == TRUE ? VARIANT_TRUE : VARIANT_FALSE;
}
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::PrintPreview()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
CWaitCursor w;
pActiveView->DoFilePrintPreview();
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::get_Toolbars(VARIANT_BOOL *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
*pVal = (m_bToolbars == 0) ? VARIANT_FALSE : VARIANT_TRUE;
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::put_Toolbars(VARIANT_BOOL newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
m_bToolbars = (newVal == VARIANT_FALSE) ? FALSE : TRUE;
//OnObjectUIChange();
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
CKyOfficeCntrItem * pDocItem = pDocument->GetDocItem();
if(pDocItem != NULL)
{
pDocItem->ExecCommand(OLECMDID_HIDETOOLBARS, OLECMDEXECOPT_DODEFAULT);
TurnOffWebToolbar(pDocItem->m_pInPlaceFrame->m_lpActiveObject);
}
m_pMainFrame->RecalcLayout();
}
return S_OK;
}
int EvalException(int n_except)
{
// Trap a few standard errors usually caused by bad
// passed in data or internal corruption. Other items should
// always be passed down the chain to NT or a waiting debugger...
if ((n_except == STATUS_ACCESS_VIOLATION) ||
(n_except == STATUS_INTEGER_OVERFLOW) ||
(n_except == STATUS_INTEGER_DIVIDE_BY_ZERO))
return EXCEPTION_EXECUTE_HANDLER;
return EXCEPTION_CONTINUE_SEARCH;
}
#define E_WIN32_ACCESSVIOLATION 0x800701E7 //HRESULT_FROM_WIN32(ERROR_INVALID_ADDRESS)
STDAPI AutoDispInvoke(LPDISPATCH pdisp, LPOLESTR pwszname, DISPID dspid,
WORD wflags, DWORD cargs, VARIANT* rgargs, VARIANT* pvtret)
{
HRESULT hr;
DISPID dspidPut = DISPID_PROPERTYPUT;
DISPPARAMS dspparm = {NULL, NULL, 0, 0};
if(pdisp == NULL)
return E_POINTER;
dspparm.rgvarg = rgargs;
dspparm.cArgs = cargs;
if ((wflags & DISPATCH_PROPERTYPUT) || (wflags & DISPATCH_PROPERTYPUTREF))
{
dspparm.rgdispidNamedArgs = &dspidPut;
dspparm.cNamedArgs = 1;
}
__try
{
if (pwszname)
{
hr = pdisp->GetIDsOfNames(IID_NULL, &pwszname, 1, LOCALE_USER_DEFAULT, &dspid);
if (FAILED(hr)) return (hr);
}
hr = pdisp->Invoke(dspid, IID_NULL, LOCALE_USER_DEFAULT,
(WORD)(DISPATCH_METHOD | wflags), &dspparm, pvtret, NULL, NULL);
}
__except(EvalException(GetExceptionCode()))
{
hr = E_WIN32_ACCESSVIOLATION;
}
return hr;
}
void CKyOfficeCtrl::TurnOffWebToolbar(LPOLEINPLACEACTIVEOBJECT lpObject)
{
/*
MSWord::_ApplicationPtr pApplication = NULL;
MSWord::_DocumentPtr pDocument = NULL;
if(lpObject && SUCCEEDED(lpObject->QueryInterface(IID__Document, (void**)&pDocument)))
{
CComQIPtr<MSWord::_Application> spApp(pDocument->Application);
CComPtr < Office::_CommandBars> spCmdBars;
if(SUCCEEDED(spApp->get_CommandBars(&spCmdBars)))
{
_bstr_t bstrWebName = _T("Web");
Office::CommandBarPtr pWebbar = spCmdBars->GetItem(bstrWebName);
if(pWebbar)
pWebbar->PutVisible(VARIANT_FALSE);
}
}
*/
IDispatch * pdisp;
VARIANT vtT[5];
if ((lpObject) && (SUCCEEDED(lpObject->QueryInterface(IID_IDispatch, (void**)&pdisp))))
{
if (SUCCEEDED(AutoDispInvoke(pdisp,
L"CommandBars", 0, DISPATCH_PROPERTYGET, 0, NULL, &vtT[0])))
{
ASSERT(vtT[0].vt == VT_DISPATCH);
vtT[1].vt = VT_BSTR; vtT[1].bstrVal = SysAllocString(L"Web");
if (SUCCEEDED(AutoDispInvoke(vtT[0].pdispVal,
L"Item", 0, DISPATCH_PROPERTYGET, 1, &vtT[1], &vtT[2])))
{
ASSERT(vtT[2].vt == VT_DISPATCH);
vtT[3].vt = VT_BOOL; vtT[3].boolVal = 0;
AutoDispInvoke(vtT[2].pdispVal,
L"Visible", 0, DISPATCH_PROPERTYPUT, 1, &vtT[3], &vtT[2]);
VariantClear(&vtT[2]);
}
VariantClear(&vtT[1]);
VariantClear(&vtT[0]);
}
pdisp->Release();
}
}
STDMETHODIMP CKyOfficeCtrl::SaveFile(VARIANT_BOOL *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
*pVal = VARIANT_FALSE;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
*pVal = (pDocument->DoFileSave() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::GetPathName(BSTR *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
*pVal = NULL;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
CString strPathName = pDocument->GetPathName();
*pVal = strPathName.AllocSysString();
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::IsOpened(VARIANT_BOOL *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
*pVal = VARIANT_FALSE;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
CString strPathName = pDocument->GetPathName();
*pVal = (strPathName.IsEmpty() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::IsModified(VARIANT_BOOL *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
*pVal = VARIANT_FALSE;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
ASSERT_VALID(pDocument);
*pVal = (pDocument->IsModified() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::AboutBox()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CDialog dlg(IDD_DIALOG_ABOUT);
dlg.DoModal();
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::PrintFile()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
CWaitCursor w;
pActiveView->DoFilePrint();
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::SetWordUserName(BSTR bstrUserName)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
USES_CONVERSION;
m_szWordUserName = W2A(bstrUserName);
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::New()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWaitCursor w;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
//先关闭
//pActiveView->DoCloseDocument();
//新建文档
pActiveView->DoNew();
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::NewDoc()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWaitCursor w;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
//先关闭
//pActiveView->DoCloseDocument();
//新建文档
pActiveView->DoNew(CLSID_WORDDOCUMENT);
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::NewPpt()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWaitCursor w;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
//先关闭
//pActiveView->DoCloseDocument();
//新建文档
pActiveView->DoNew(CLSID_PPTPRESENTATION);
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::NewExcelWorkBook()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWaitCursor w;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
//先关闭
//pActiveView->DoCloseDocument();
//新建文档
pActiveView->DoNew(CLSID_EXCELWORKBOOK);
}
return S_OK;
}
STDMETHODIMP CKyOfficeCtrl::NewExcelChart()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWaitCursor w;
if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
{
CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
ASSERT_VALID(pActiveView);
//先关闭
//pActiveView->DoCloseDocument();
//新建文档
pActiveView->DoNew(CLSID_EXCELCHART);
}
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -